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