rune類型
在看一些開源項目的源代碼時,經常看到rune類型的使用,本文就詳細說下rune類型,首先看下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.
type rune = int32
可以看出rune類型是int32類型的別名,等價于int32,之所以定義rune類型是因為按照慣例用來區分字符值和整數值用的。 rune類型通常用于表示一個unicode字符的碼點,也就是unicode編碼中的字符編碼,支持 Unicode 的 1,114,112 個碼點。
使用方法
定義一個rune類型的變量可以使用單引號,例如:
var r1 rune = 'A'
var r2 rune = '你'
var r3 rune = 'U0001F600' // 笑臉表情的 Unicode 碼點是 U+1F600
可以使用 %c 來格式化rune類型的變量,例如:
fmt.Printf("r1: %cn", r1) // 輸出: r1: A
fmt.Printf("r2: %cn", r2) // 輸出: r2: 你
fmt.Printf("r3: %cn", r3) // 輸出: r3:
在字符串中使用rune類型可以表示一個Unicode 字符,例如:
str := "你好,世界!"
r := []rune(str)
fmt.Printf("%cn", r[0]) // 輸出: 你
因為rune是32位的整型,當把一個rune變量賦值給一個int類型的變量時需要進行類型轉換:
var r rune = 'A'
var i int = int(r)
計算字符串長度
眾所周知,一個中文字符在unicode編碼中占2個字節,而在utf-8編碼中占3個字節。golang默認編碼是utf-8,如果想得到一個字符串的長度而不是字符串占用的字節長度的場景,就需要使用rune類型:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
var str = "hello,世界"
//計算占用的字節數
fmt.Println("字節數:", len(str))
//以下兩種都可以得到str的字符數
//unicode/utf8包提供了獲取字符數的方法
fmt.Println("字符數:", utf8.RuneCountInString(str))
//通過rune類型處理unicode字符方式
fmt.Println("字符數:", len([]rune(str)))
}
輸出結果:
字節數: 12
字符數: 8
字符數: 8