![Go语言底层原理剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/131/40795131/b_40795131.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.2 符文类型
Go语言的设计者认为[1],用字符(character)表示字符串的组成元素可能产生歧义,因为有些字符非常相似,例如小写拉丁字母a与带重音符号的à。这些相似的字符真正的区别在于其编码后的整数是不相同的,a被表示为0x61,à被表示为0xE0。因此在Go语言中使用符文(rune)类型来表示和区分字符串中的“字符”,rune其实是int32的别称。
当用range轮询字符串时,轮询的不再是单字节,而是具体的rune。如下所示,对字符串b进行轮询,其第一个参数index代表每个rune的字节偏移量,而runeValue为int32,代表符文数。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_74_3.jpg?sign=1738882457-7S0DwsV3CXcey7vyJDyrh2ELHQ7zSBpA-0-afe0aa48a4f783b132b2efb0f9eb4445)
fmt.Printf有一个特殊的格式化符#U可用于打印符文数十六进制的Unicode编码方式及字符形状。如上例打印出:
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_74_4.jpg?sign=1738882457-3XHz7khY1i1d3wWwnPfFrb14sy4F8kTT-0-af819b56cbda2eece110e4d75aa55438)
Go的标准库unicode/utf8为解释UTF-8文本提供了强大的支持,包含了验证、分离、组合UTF-8字符的功能。例如DecodeRuneInString函数返回当前字节之后的符文数及实际的字节长度。上面的for range样例可以改写为如下形式:
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_75_1.jpg?sign=1738882457-3WwD76X6bzxmOHAkVlVvZ4I6M6R40D6C-0-851bfa7bddeb14d4d07df9498918f49b)