
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.2 符文类型
Go语言的设计者认为[1],用字符(character)表示字符串的组成元素可能产生歧义,因为有些字符非常相似,例如小写拉丁字母a与带重音符号的à。这些相似的字符真正的区别在于其编码后的整数是不相同的,a被表示为0x61,à被表示为0xE0。因此在Go语言中使用符文(rune)类型来表示和区分字符串中的“字符”,rune其实是int32的别称。
当用range轮询字符串时,轮询的不再是单字节,而是具体的rune。如下所示,对字符串b进行轮询,其第一个参数index代表每个rune的字节偏移量,而runeValue为int32,代表符文数。

fmt.Printf有一个特殊的格式化符#U可用于打印符文数十六进制的Unicode编码方式及字符形状。如上例打印出:

Go的标准库unicode/utf8为解释UTF-8文本提供了强大的支持,包含了验证、分离、组合UTF-8字符的功能。例如DecodeRuneInString函数返回当前字节之后的符文数及实际的字节长度。上面的for range样例可以改写为如下形式:
