文章目录
- Golang 当中 byte 和 rune 类型的区别
- 类型定义与用途
- 字符串处理差异
- 内存占用
- 典型引用场景
Golang 当中 byte 和 rune 类型的区别
在 Golang 中,rune
和 byte
类型的区别主要体现在字符处理的方式和编码支持上。
类型定义与用途
byte 类型
- 本质是
uint8
的别名; - 用于处理原始字节数据或 ASCII 字符;
- 适合二进制操作或处理单字节编码的文本(如 ASCII);
rune 类型
- 本质是
int32
的别名; - 用于处理 Unicode 码点,支持 UTF-8 编码的多字节字符;
- 适合需要操作完整字符的场景,尤其是非 ASCII 文本,比如中文。
字符串处理差异
遍历字符串
使用索引逐字节访问时,返回 byte 类型。使用 range 遍历时,返回 rune 类型,自动解码 UTF-8 字符:
s := "Hello 世界"
// 按byte遍历(可能拆散多字节字符)
for i := 0; i < len(s); i++ {b := s[i] // 类型为byte
}// 按rune遍历(完整字符)
for _, r := range s {fmt.Printf("%c ", r) // 输出:H e l l o 世 界
}
转换切片
[]byte(s)
将字符串转换为原始字节序列;
[]rune(s)
将字符串转换为 Unicode 码点序列;
s := "世界"
fmt.Println(len([]byte(s))) // 输出6(UTF-8编码下每个汉字占3字节)
fmt.Println(len([]rune(s))) // 输出2(两个字符)
内存占用
byte
:占用一个字节;rune
:占用四个字节;
典型引用场景
byte 适用场景
- 处理二进制文件(如图片、音频);
- 操作 ASCII 字符串(如解析 HTTP 请求头,从数据流中获取指定长度的字节流使用的也是 byte 类型);
- 需要低内存占用的场景;
rune 适用场景
- 统计字符数量;
- 反转含多字节字符的字符串;
- 处理 UTF-8 字符的切割、替换等操作。