【go】类型byte和rune是什么

要讨论byte和rune,自然就离不开unicode字符集,那么什么是unicode字符集呢?我们知道计算机存储的都是二进制,如果一个字符要存储到计算机中,那么会事先通过一个映射关系表,也就是我们所说的unicode字符集,找到这个字符对应的16进制表示。unicode字符集收录了世界上所有的字符,不管汉字或者英文、数字、符号等,里面都可以找到一个对应的16进制的表示。

  • 例如:“你好,wei”,在unicode字符集中对应的16进制是这样表示的
你  	4f60
好  	597d
,		ff0c
w 		0077
e 		0065
i 		0069
  • 那么对应的二进制存储到计算机中就是如下所示
你  	0100111101100000
好  	0101100101111101
,		1111111100001100
w 		0000000001110111
e 		0000000001100101
i 		0000000001101001

可是这样的话,未免有点浪费空间了,英文只需要分配一个字节就够了,多余的空间会造成浪费。可是计算机又不知道从哪里开始读取,哪里读取结束,每次它只固定读取两个字节转换为一个字符就完事,这种就是定长编码。因此就有了utf8的编码方式出现,它是以如下的模板来识别每次应该读取多少字节作为一个字符。

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx... ...

上面的x就是应该填入的二进制位,找到适合的模板,从地位开始填入,高位补0。因此,经过优化后的二进制存储方式为:

你  	11100100 10111101 10100000
好  	11100101 10100101 10111101
,		11101111 10111100 10001100
w 		01110111
e 		01100101
i 		01101001

这样通过特定标识符来告诉计算机开始结束读取的位置,又节省了空间,这就是变长编码
所以,当我们定义一个字符串s := "你好,wei"时,强转为[]byte或者[]rune时候如下

	s := "你好,wei"
	fmt.Println([]rune(s)) // 输出 [20320 22909 65292 119 101 105]
	fmt.Println([]byte(s)) // 输出 [228 189 160 229 165 189 239 188 140 119 101 105]

可以看出

  • 强转为[]rune类型输出时候,程序会从utf8编码格式模板里面抠出对应的二进制位,输出该字符的unicode字符集对应数的十进制表示。一个字符对应一个数组元素。
[20320 22909 65292 119 101 105]
等价于
[100111101100000 101100101111101 1111111100001100 1110111 1100101 1101001]
  • 强转为[]byte类型输出时候,程序会输出包含utf8编码格式模板的每个字节,并输出十进制表示
[228 189 160 229 165 189 239 188 140 119 101 105]
等价于
[11100100 10111101 10100000 11100101 10100101 10111101 11101111 10111100 10001100 01110111 01100101 01101001]
  • 我们查看go源码可以看到,rune是int32的别名,byte是uint8的别名
type rune = int32
type byte = uint8
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值