1.?rune類型
1.1. 基本概念
1. rune是Go語言的內建類型,它是int32的別名,即32位有符號整數;
2. 用于表示一個Unicode碼點,全拼Unicode code point;
3. 可以表示任何UTF-8編碼的字符;
1.2.?特點
1. 每個rune對應一個Unicode字符;
2. 可以表示超過ASCII范圍的字符,如中文、日文、表情等;
3. 在內存中占用4個字節,即32位;
1.3. 使用示例
func main() {s := "你好,世界"for _, r := range s {fmt.Printf("%c => %U\n", r, r)}
}
2.?byte類型
2.1.?基本概念
1. byte是Go語言的內建類型,它是uint8的別名,即8位無符號整數;
2. 用于表示一個ASCII字符或UTF-8編碼的一個字節;
2.2.?特點
1. 每個byte對應一個字節,其中每個字創8位;
2. 只能表示ASCII字符或UTF-8編碼的單個字節;
3. 在內存中占用1個字節;
2.3.?使用示例
func main() {s := "Hello"for i := 0; i < len(s); i++ {fmt.Printf("%c => %d\n", s[i], s[i])}
}
3.?rune和byte的主要區別
4.?字符串遍歷時的差異
4.1.?使用byte遍歷,可能出錯
s := "你好"
for i := 0; i < len(s); i++ {fmt.Printf("%x ", s[i]) // 打印UTF-8編碼的每個字節
}
// 輸出: e4 bd a0 e5 a5 bd (6個字節)
4.2.?使用rune遍歷,正確方式
s := "你好"
for _, r := range s {fmt.Printf("%c ", r) // 打印每個Unicode字符
}
// 輸出: 你 好
5.?類型轉換
5.1. 字符串轉[]rune
s := "你好"
runes := []rune(s) // 轉換為rune切片
5.2. []rune轉字符串
runes := []rune{'你', '好'}
s := string(runes)
5.3.?字符串轉[]byte
s := "你好"
bytes := []byte(s) // 轉換為byte切片
5.4.?[]byte轉字符串
bytes := []byte{0xe4, 0xbd, 0xa0} // "你"的UTF-8編碼
s := string(bytes)
6.?實際應用場景
6.1.?rune的典型使用場景
1. 處理包含非ASCII字符的字符串;
2. 需要按字符而非字節操作字符串時;
3. 計算字符串的實際字符數而非字節數;
func countChars(s string) int {return len([]rune(s))
}
6.2.?byte的典型使用場景
1. 處理二進制數據;
2. 處理純ASCII字符串;
3. 需要與底層字節交互時;
func processBinary(data []byte) {// 處理字節數據
}
7.?注意事項
1. 使用len()函數直接獲取字符串長度時,返回的是字節數而非字符數;
2. 對非ASCII字符串按索引訪問時,得到的是UTF-8編碼的單個字節而非完整字符;
3. 在range循環中迭代字符串時,會自動按rune處理;
正確獲取字符串字符數的方法:
s := "你好,世界"
charCount := utf8.RuneCountInString(s) // 或者 len([]rune(s))