有伙伴可能会疑问了,字符串的遍历不是很简单吗,一个for循环搞定:
func main() {
s := "Hello world"
for i := 0; i < len(s); i++ {
fmt.Printf("%c:ASCII码:%d ", s[i], s[i])
}
}
/*
H:ASCII码:72 e:ASCII码:101 l:ASCII码:108 l:ASCII码:108 o:ASCII码:111 :ASCII码:32 w:ASCII码:119 o:ASCII码:111 r:ASCII码:114 l:ASCII码:108 d:ASCII码:100
*/
这种遍历方式很常见,对于字母等是没有问题,不过我们看下里面如果有中文的情况:
func main() {
s := "Hello 寅恪光潜"
for i := 0; i < len(s); i++ {
fmt.Printf("%c:ASCII码:%d ", s[i], s[i])
}
}
/*
H:ASCII码:72 e:ASCII码:101 l:ASCII码:108 l:ASCII码:108 o:ASCII码:111 :ASCII码:32 å:ASCII码:229 ¯:ASCII码:175
:ASCII码:133 æ:ASCII码:230 :ASCII码:129 ª:ASCII码:170 å:ASCII码:229
:ASCII码:133 :ASCII码:137 æ:ASCII码:230 ½:ASCII码:189 :ASCII码:156
*/
上面就会出现乱码,很明显属于编码的问题,中文超出了ASCII码了,这个时候我们使用for range来遍历:
func main() {
s := "Hello 寅恪光潜"
for k, v := range s {
fmt.Printf("%d,%c:Unicode码:%d ", k, v, v)
}
}
/*
0,H:Unicode码:72 1,e:Unicode码:101 2,l:Unicode码:108 3,l:Unicode码:108 4,o:Unicode码:111 5, :Unicode码:32 6,寅:Unicode码:23493 9,恪:Unicode码:24682 12,光:Unicode码:20809 15,潜:Unicode码:28508
*/
从这里的中文可以看出每个中文占了3字节,所以按照索引的遍历方式就切断了对吧,于是出现乱码,所以使用range的方式来遍历,就没有问题,扩大编码范围
期待您的加入,一起学习进步。