今天在看go的一个源码的时候,看到了rune,所以就想看看它的使用场景。 官网说 rune 是 int32的别名 下面通过一个案例说明问题:
package test
import (
"fmt"
"testing"
"unicode/utf8"
)
func TestRune(t *testing.T) {
var str = "hello 中国"
//golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。
fmt.Println("len(str):", len(str))//输出 12
//如果我们预期想得到一个字符串的长度,而不是字符串底层占得字节长度,那就可以通过rune实现
//通过utf8的RuneCountInString方法处理
fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))//输出8
//通过rune类型处理
fmt.Println("rune:", len([]rune(str)))//输出8
//for-range循环,输出结果如下
//k1= 0 v1= h
//k1= 1 v1= e
//k1= 2 v1= l
//k1= 3 v1= l
//k1= 4 v1= o
//k1= 5 v1=
//k1= 6 v1= 中
//k1= 9 v1= 国 //这里索引自动 +3
//k2= 0 v2= h
//k2= 1 v2= e
//k2= 2 v2= l
//k2= 3 v2= l
//k2= 4 v2= o
//k2= 5 v2=
//k2= 6 v2= 中
//k2= 7 v2= 国 //索引递增
//--- PASS: TestRune (0.00s)
//PASS
s1 := "hello 中国"
for k, v := range s1 {
fmt.Println("k1=", k, "v1=", string(v))
}
fmt.Println("")
for k, v := range []rune(s1) {
fmt.Println("k2=", k, "v2=", string(v))
}
//rune 等同于int32,常用来处理unicode或utf-8字符
}
