我们通过理解例子来测试golang的字符串循环。
func main() {
var s string = "hello,我的中国"
var len int = len(s)
fmt.Println(len)
for i := 0; i < len; i++ {
fmt.Printf("%c", s[i])
}
}
首先看到字符串s="hello,我的中国"长度为18,说明每个中文占用3个字节来表示。此时按照字节长度s[i]打印中文肯定是乱码。
我们再来看一个例子:
func main() {
var s string = "hello,我的中国"
var len int = len(s)
fmt.Println(len)
for _, v := range s {
fmt.Printf("%c", v)
}
}
为什么for...range可以正常打印包含中文的字符串?
我们再看一个例子:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
var s string = "hello,我的中国"
//len计算字符串占用字节长度
var len int = len(s)
//计算字符串长度(包含全世界语言)
var utf8Len int = utf8.RuneCountInString(s)
fmt.Println("占用字节长度:", len)
fmt.Println("字符串的长度:", utf8Len)
for _, v := range s {
fmt.Printf("%c", v)
}
}
现在我们来总结一下:go语言的len函数,统计字符串长度的时候,它的底层原来就是统计字符串占用内存的字节长度。假如这些字符串都是ascii(0-128)表示,那么字节长度==字符串长度。当字符串包含有双字节或者多字节的语言。统计字符串长度时,需要做utf8.RuneCountInString。这就解释了for s[i]为乱码的原因。for ...range是以字符串长度(实际长度,底层做过一定转换)来做循环取值。