有伙伴可能会疑问了,字符串的遍历不是很简单吗,一个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的方式来遍历,就没有问题,扩大编码范围

期待您的加入,一起学习进步。