知识卡片
Rune承载字符
内容
rune 是 Unicode 码点,解决“一个字符不等于一个字节”的问题。遍历用户可见文本时应以 rune 或更高层的文本规则思考,否则中文、emoji 和组合字符会暴露隐藏假设。
参考来源
- 位置:《Go语言底层原理剖析》第5章《字符串本质与实现》5.2节《符文类型》
- 结论依据:原文说明 Go 设计者认为用"字符"表示字符串组成元素会产生歧义(如 a 与 à 编码不同),因此引入 rune 类型区分字符,并指出"rune其实是int32的别称";同时说明用 range 轮询字符串时得到的是字节偏移量和 int32 类型的符文数,而不是单字节,因此可以推出"rune 是 Unicode 码点、解决字符与字节不对等问题"的结论。
- 原始内容:Go语言的设计者认为,用字符(character)表示字符串的组成元素可能产生歧义,因为有些字符非常相似,例如小写拉丁字母a与带重音符号的à。这些相似的字符真正的区别在于其编码后的整数是不相同的,a被表示为0x61,à被表示为0xE0。因此在Go语言中使用符文(rune)类型来表示和区分字符串中的"字符",rune其实是int32的别称。当用range轮询字符串时,轮询的不再是单字节,而是具体的rune。