1. string 类型
golang string 类型采用utf8 编码,是一种变长的编码方式
strs := "好好学习!!!"
fmt.Printf("len:%v \n", len(strs))
fmt.Printf("\n string : ")
for index, ch := range strs {
fmt.Printf("(%v %X) ", index, ch)
}
fmt.Printf("\n []byte() : ")
for index, ch := range []byte(strs) {
fmt.Printf("(%v %X) ", index, ch)
}
fmt.Printf("\n []rune() : ")
for index, ch := range []rune(strs) {
fmt.Printf("(%v %X) ", index, ch)
}
// 输出如下:
len:15
string : (0 597D) (3 597D) (6 5B66) (9 4E60) (12 21) (13 21) (14 21)
[]byte() : (0 E5) (1 A5) (2 BD) (3 E5) (4 A5) (5 BD) (6 E5) (7 AD) (8 A6) (9 E4) (10 B9) (11 A0) (12 21) (13 21) (14 21)
[]rune() : (0 597D) (1 597D) (2 5B66) (3 4E60) (4 21) (5 21) (6 21)
这里对string 遍历的时候,每个字符是变长的,中文占三个字节;
[]byte 转换之后,会遍历每个字节;
[]rune 转换之后,会将每个字符转换rune,也就是int32
2. utf8 编码的常见操作
- utf8.RuneCountInString 可以统计utf8 字符数
- utf8.DecodeRune 读取一个utf8 字符
strs := "好好学习!!!"
fmt.Printf("\nRune Count:%v\n", utf8.RuneCountInString(strs))
bts := []byte(strs)
for len(bts) > 0 {
ch, size := utf8.DecodeRune(bts)
fmt.Printf("%c ", ch)
bts = bts[size:]
}