rune
類型是Go語言的一種特殊數字類型,在builtin/builtin.go
文件中,它的定義爲:type rune = int32
;官方對它的解釋是:rune
是類型int32
的別名,在所有方面都等價於它,用來區分字符值跟整數值。由於Go語言中採用的是統一的UTF-8編碼,英文字母在底層佔1個字節,特殊字符和中文漢字則佔用1~3個字節,在Go語言中文的計數和截取並不如其他語言(比如Python)那麼容易,所以Go提供了rune
類型來處理中文的計數和分割問題,以支持國際化多語言。
下面我們通過一個例子來感受一下Go中使用rune
的兩個場景。
- 統計帶中文字符串的長度
package main
import "fmt"
func main() {
s := "阿福Chris"
fmt.Println(len(s)) //輸出11
fmt.Println(len([]rune(s))) //輸出7
}
從上面的例子可以看出,我們使用len函數取帶有中文的字符串長度時,獲得的並不是真正的字符個數,當然如果全都是英文是不存在這個問題的;在上面例子中,由於有中文,就影響到了對長度的正確衡量,此時,我們使用rune進行轉換,便可以獲得正確的長度。
- 截取中文字符串
package main
import "fmt"
func main() {
s := "阿福Chris"
fmt.Println(s[:2]) //輸出亂碼�
fmt.Println(string([]rune(s)[:2])) //輸出阿福
}
從上面的例子可以看出,與長度計算一樣,如果不採用rune,想取“阿福”這兩個字,會從底層直接取前兩個字符串,這樣取出來的必然是亂碼;第二個打印中,採用了rune來取前兩個漢字就可以正常獲得結果了(注意這裏面使用了string是對漢字和編碼進行了轉換)。
最後附上一張“字符串”、“Unicode碼點”和“原始字節”的轉換表,方便大家理解爲什麼rune
類型可以更好的完成中文的處理。