参考: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 ", 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 ", len(str)) //返回len(str):12 fmt.Printf("len(rune(str)):%d ", len([]rune(str))) //len(rune(str)):8 }
同理可知,其实byte也是为了解决字符的问题,只是它是用来解决ascii字符的,所以长度短一些,为int8