1. len 按字节计算字符串长度
len是按照字节的长度计算字符串长度,不是按照字符数量来的,比如下面这个例子:
// main.go
package main
import "fmt"
func main() {
var (
s1 = "你好中国"
s2 = "hello china"
)
fmt.Println("s1的长度:", len(s1))
fmt.Println("s2的长度:", len(s2))
}
// 输出:
// s1的长度: 12
// s2的长度: 11
可以从这段代码看出,一个中文字符是3个字节,一个英文字符是1个字节,仅仅只有4个汉字使用len计算的长度都要比10个英文字母和一个空格加起来使用len计算的长度还要长。
2. 字符串遍历问题
在go中我们非常清楚遍历一个字符串可以使用 for ... range ...
的语法进行遍历,所以遍历一段中文字符串的代码可以如下:
// main.go
package main
import "fmt"
func main() {
var (
s1 = "你好中国"
s2 = "hello china"
)
fmt.Println("你好中国遍历:")
for i, v := range s1{
fmt.Printf(" i:%v v:%v ", i, v)
}
fmt.Println("\n\nhello china遍历:")
for i, v := range s2{
fmt.Printf(" i:%v v:%v ", i, v)
}
}
// 输出:
你好中国遍历:
i:0 v:20320 i:3 v:22909 i:6 v:20013 i:9 v:22269
hello china遍历:
i:0 v:104 i:1 v:101 i:2 v:108 i:3 v:108 i:4 v:111
i:5 v:32 i:6 v:99 i:7 v:104 i:8 v:105 i:9 v:110 i:10 v:97
从这段代码的输出可以看出,go中使用 for ... range ...
方式遍历中文字符串时,索引的跳动是3个字节进行跳动的,非我们想要的。
这个时候我们就需要使用 []rune(str)
对字符串进行转换,代码如下:
package main
import "fmt"
func main() {
var (
s1 = "你好中国"
s2 = "hello china"
)
r1 := []rune(s1)
r2 := []rune(s2)
fmt.Println(r1)
fmt.Println(r2)
fmt.Println("你好中国遍历:")
for i, v := range r1{
fmt.Printf(" i:%v v:%v ", i, v)
}
fmt.Println("\n\nhello china遍历:")
for i, v := range r2{
fmt.Printf(" i:%v v:%v ", i, v)
}
}
// 输出:
你好中国遍历:
i:0 v:20320 i:1 v:22909 i:2 v:20013 i:3 v:22269
hello china遍历:
i:0 v:104 i:1 v:101 i:2 v:108 i:3 v:108 i:4 v:111
i:5 v:32 i:6 v:99 i:7 v:104 i:8 v:105 i:9 v:110 i:10 v:97
可以看出,此时的中文的索引位置都已经正确了,这样在中英文混合的字符串中,就不必考虑索引跳位的问题了。
3. 字符串转整数
str := strconv.Atoi("123")
4. 整数转字符串
n, err := strconv.Itoa(123)
5. 字符串转[]byte
var bytes = []byte(str)
6. []byte转字符串
var s = string([]byte{97,98,99})
7. 十进制转2、8、16进制
str = strconv.FormatInt(100, 2)
str = strconv.FormatInt(100, 8)
str = strconv.FormatInt(100, 16)
8. 包含子串
strings.Contains("hello world", "hello") // true
9. 统计子串的数量
strings.Count("hello world", "o") // 2
10. 不区分大小写比较字符串
strings.EqualFold("Abc", "abc")
11. 返回子串第一次出现的索引,找不到返回-1
strings.Index("abcde", "cde") // 2
12. 返回子串最后一次出现的索引,找不到返回-1
strings.Index("abcdabcde", "cd") // 6
13. 将指定子串替换成其他字符串
strings.Replace("go go go come go!", "go", "ok", 3)
// 3 代表替换三次, 如果是-1则代表全部更换
14. 按照某字符切割字符串
strings.Split("hello world,china", ",")
// []string{"helllo world", "china"}
15. 将字符串大小写进行转换
strings.ToLower("Go") // go
strings.ToUpper("Go") // GO
16. 将字符串左右两侧空格去掉
strings.TrimSpace(" abc ") // abc
17. 将字符串左右两侧指定字符去掉
strings.Trim("abc", "ac") // b
18. 将字符串左侧指定字符去掉
strings.TrimLeft("abc", "ac") // bc
19. 将字符串右侧指定字符去掉
strings.TrimRight("abc", "ac") // ab
20. 判断字符串是否以某个子串开头
strings.HasPrefix("abcdddd", "abc") // true
21. 判断字符串是否以某个子串结尾
strings.HasSuffix("adfasdfasf", "xy") // false