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