![5f36e866a721d03969048ba7fffb6c2b.png](https://i-blog.csdnimg.cn/blog_migrate/64fc108eacca392d92930fd32769282f.jpeg)
Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。
这就引入了一个问题:对于ascii字符,一个字符占一个字节;对于非ASCII字符,比如汉字,一个字符就占3个字节。如字符串“hello北京”,它的字符长度是7,但它的字节长度是11.
- 字符串的长度
内建函数 len() 返回的是字符串的字节长度,如果是字符串仅包含ASCII字符,那么也等于字符个数;对于包含非ASCII字符的字符串,len() 的返回值不等于字符个数,对于这类情况,使用 UTF-8 包提供的 RuneCountInString() 函数,统计 Uncode 字符数量。如:utf8.RuneCountInString("hello北京") 。
- 字符串的遍历
- index 遍历
var str = "Hello北京"
for i := 0; i < len(str); i++ {
fmt.Printf(str[i])
}
这种方式按照字节遍历,对于非ASCII字符会出现乱码。因为"北京"每个字占3个字节
2. for-range遍历
var str = "Hello北京"
for index, ch := range str {
fmt.Printf(ch)
}
这种方式是按照字符遍历的,不会出现乱码,但是下标index会出现不连续的情况,它具有不确定性
3. 转换为 []rune 切片再用 index 遍历
var str = "Hello北京"
str2 := []rune(str)
for i := 0; i < len(str2); i++ {
fmt.Printf(str2[i])
}
这种方式是按照字符遍历的,同时下标是连续的。