文章目錄
- 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 字符的切割、替換等操作。