參考:https://www.jianshu.com/p/4fbf529926ca
rune是用來區分字符值和整數值的
- byte 等同於int8,即一個字節長度,常用來處理ascii字符
- rune 等同於int32,即4個字節長度,常用來處理unicode或utf-8字符
舉例說明:
package main import ( "fmt" ) func main() { str := "你好 world" fmt.Printf("len(str):%d\n", len(str)) //返回len(str):12 }
返回值為12是因為中文字符在unicode下占2個字節,在utf-8編碼下占3個字節,而golang默認編碼正好是utf-8。
所以上面例子中的"你好"占據了六個字節
但是其實我們期望得到的結果是8,即不以字節數來計算長度,而是以字符數來計算長度
解決的辦法就是將該string轉成rune類型,rune類型為int32,即4個字節,能夠很好地將utf-8編碼下三字節長度的中文字符保存進來,這樣就能夠得到長度為8的值了
package main import ( "fmt" ) func main() { str := "你好 world" fmt.Printf("len(str):%d\n", len(str)) //返回len(str):12 fmt.Printf("len(rune(str)):%d\n", len([]rune(str))) //len(rune(str)):8 }
同理可知,其實byte也是為了解決字符的問題,只是它是用來解決ascii字符的,所以長度短一些,為int8