golang中string,rune,byte的关系

  1. golang中String的底层是使用byte[]数组存储的,不可改变
1
2
str := "Golang 测试"
fmt.Println(len(str))

这段代码按道理应该输出6+1+2.

实际运行之后输出却是13, 原因是中文字符在utf-8编码的系统中是3个字节存储的,在Unicode中是2个字节存储的,go的默认编码格式是utf-8,so。。

这时候,我们使用下标访问字符串中的中文字符是不行的,想要使用下标访问,就需要rune出马。

  1. 在官方文档中,rune的定义是:
1
2
3
4
5
6
 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切片来实现。

1
fmt.Println("rune:", len([]rune(str)))

就会输出预期的rune: 9.

这时我们也可以按照下标去访问str中的字符了。即[7]rune(str) = “测”。

3.总结

string的底层是byte,byte与rune的不同之处是:

byte 等同于int8,常用来处理ascii字符
rune 等同于int32,常用来处理unicode或utf-8字符

或者可以这样说:

rune 能操作任何字符
byte 不支持中文的操作

​ END


-------------The End-------------

本文标题:golang中string,rune,byte的关系

文章作者:cloud sjhan

发布时间:2018年10月25日 - 09:10

最后更新:2018年10月25日 - 10:10

原始链接:https://cloudsjhan.github.io/2018/10/25/golang中string-rune-byte的关系/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

cloud sjhan wechat
subscribe to my blog by scanning my public wechat account
坚持原创技术分享,您的支持将鼓励我继续创作!
0%
;