在學習golang基礎的時候,發現有個叫rune的的數據類型,當時不理解這個類型的意義。
查詢,官方的解釋如下:
```
// 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的作用與意義比較懵逼,我們通過一個簡單的Demo來看下rune的作用。先來看下下面這塊代碼執行結果是什么?
```
package main
import (
"fmt"
)
func main() {
s := "hello 你好" // 8 = 5個字符 + 1個空格 + 2個漢字
fmt.Println("len(s):", len(s)) // len(s): 12
}
```
> 我們猜測結果應該是:`8 = 5個字符1個空格2個漢字`。世界打印結果為:`len(s): 12`
#### 分析原因
> 1、golang中string底層是通過byte數組實現的。
> 2、中文字符在unicode下占2個字節,
> 3、在utf-8編碼下占3個字節,
> 4、而golang默認編碼正好是utf-8。
那么?如果我們預期想得到一個字符串的長度,而不是字符串底層占得字節長度,該怎么辦呢???
```
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)))
}
```
打印結果
```
len(str): 12
RuneCountInString: 8
rune: 8
```
golang中有一個`byte`數據類型與`rune`相似,它們都是用來表示字符類型的變量類型。它們的不同在于:
* `byte` 等同于`int8`,常用來處理`ascii`字符
* `rune` 等同于`int32`,常用來處理`unicode`或`utf-8`字符