Go中rune和byte的区别
Go 中的 rune 和 byte 区别:
类型 | 本质 | 描述 | 常见用途 |
---|---|---|---|
byte |
uint8 的别名 |
表示一个 ASCII 字符或字节 | 处理原始二进制数据、ASCII 字符串 |
rune |
int32 的别名 |
表示一个 Unicode 码点 | 处理 Unicode 字符(多字节字符) |
为什么需要这两个类型?
Go 的字符串是以 UTF-8 编码的,即一个字符可能由 1~4 个字节组成。举例:
s := "a中"
fmt.Println(len(s)) // 4:'a' 占 1 字节,'中' 占 3 字节
fmt.Println([]rune(s)) // [97 20013]:分别是 'a' 和 '中' 的 Unicode 码点
fmt.Println([]byte(s)) // [97 228 184 173]:UTF-8 编码的字节表示
选择建议:
使用场景 | 建议使用 |
---|---|
处理英文字符或原始数据(ASCII) | byte |
涉及中文、emoji、特殊符号等多字节字符 | rune |
想获取“字符个数”(而不是字节数) | 转成 []rune |
读取、修改字符串中的字符 | []rune (避免破坏 UTF-8 编码) |
示例对比
s := "a中😊"
// 字节级访问(可能会切断字符)
b := []byte(s)
fmt.Println(len(b)) // 7
fmt.Println(b) // [97 228 184 173 240 159 152 138]
// 字符级访问
r := []rune(s)
fmt.Println(len(r)) // 3
fmt.Println(r) // [97 20013 128522]
总结口诀:
byte 看字节,适合处理英文和二进制
rune 看字符,适合处理 Unicode 字符(如中文、emoji)
想“安全地”处理字符串中的字符?用 []rune