查詢,官方的解釋以下:golang
// rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by convention, to distinguish character values from integer values. //int32的別名,幾乎在全部方面等同於int32 //它用來區分字符值和整數值 type rune = int32
咱們經過一個簡單的例子來看下rune的做用。先來看下下面這塊代碼執行結果是什麼?數組
package main import "fmt" func main() { var str = "hello 你好" fmt.Println("len(str):", len(str)) }
咱們猜想結果應該是:8:5個字符1個空格2個漢字。那麼正確答案是多少呢?ui
len(str): 12
結果竟然是12,這是爲何呢!?編碼
golang中string底層是經過byte數組實現的。中文字符在unicode下佔2個字節,在utf-8編碼下佔3個字節,而golang默認編碼正好是utf-8。
那麼?若是咱們預期想獲得一個字符串的長度,而不是字符串底層佔得字節長度,該怎麼辦呢???code
package main import ( "fmt" "unicode/utf8" ) func main() { var str = "hello 你好" //golang中string底層是經過byte數組實現的,直接求len 實際是在按字節長度計算 因此一個漢字佔3個字節算了3個長度 fmt.Println("len(str):", len(str)) //如下兩種均可以獲得str的字符串長度 //golang中的unicode/utf8包提供了用utf-8獲取長度的方法 fmt.Println("RuneCountInString:", utf8.RuneCountInString(str)) //經過rune類型處理unicode字符 fmt.Println("rune:", len([]rune(str))) }
運行結果:blog
len(str): 12 RuneCountInString: 8 rune: 8
golang中還有一個byte數據類型與rune類似,它們都是用來表示字符類型的變量類型。它們的不一樣在於:utf-8