在Go
语言中,字符串就是一个只读(read-only
)的,可以包含任意字节(byte
)的切片(slice
)。由于Go
源码文件都是使用UTF-8
编码的,所以直接在源码中输入的字符串也都是用UTF-8
编码的(前提是字符串里没有byte-level escapes
,即字节层面上的转义)。请看下面这个例子:
package main
import "fmt"
func main() {
s := "日志log"
fmt.Println(len(s))
}
执行结果:
9
s
是一个UTF-8
编码的字符串,“日志
”两个汉字各占3
个字节,所以一共是9
个字节。
再看一个例子:
package main
import "fmt"
func main() {
s:="\xFF\xFF"
fmt.Println(len(s))
}
执行结果:
2
虽然0xFF
不是一个合法的UTF-8
编码字符,但是因为字符串可以包含任意字节,所以s
仍是一个合法的字符串。
Go
语言引入rune
类型(实际就是int32
)来表示字符(character
),“日志log
”这个字符串包含了5
个字符,9
个字节。 可以用for range
循环来遍历UTF-8
编码字符串的每个字符:
package main
import "fmt"
func main() {
s := "日志log"
for index, runeValue := range s {
fmt.Printf("%#U starts at byte position %d\n", runeValue, index)
}
}
执行结果:
U+65E5 '日' starts at byte position 0
U+5FD7 '志' starts at byte position 3
U+006C 'l' starts at byte position 6
U+006F 'o' starts at byte position 7
U+0067 'g' starts at byte position 8