Go string byte rune 深入理解

在 go 中。有 byte, string 以及 rune.
虽然很常见的,但是如果要理解他们的区别还是很重要的,不然可能就犯错误了。
比如索引字符串中的第n个字符,但是如果仅仅使用下标去索引,就大错特错了。

string

在go中, string不是面向字符的,仅仅是byte的数组
我们可以通过打印来查看
事先说明:
%x: 将其16进制数打印.
%q: 打印并且过滤掉不可以打印的字节
%+q: + 等于 plus, 这个不只可以过滤不可以打印的字符,而且可以过滤掉不是 ascii的字符会翻译成 UTF-8

上例子

const sample = "\xbd\xb2\x3d\xbc\x20\xe2\x8c\x98"
fmt.Printf("%x\n", sample) // bdb23dbc20e28c98 
fmt.Printf("% x\n", ) // bd b2 3d bc 20 e2 8c 98
fmt.Printf("%q\n", sample) // "\xbd\xb2=\xbc ⌘" 
fmt.Printf("%+q\n", sample) //"\xbd\xb2=\xbc \u2318"

另外一个例子: 我们通过三种方式打印这个字符

const placeOfInterest = `⌘`
fmt.Printf("只是打印 string: %s\n", placeOfInterest)

fmt.Printf("quoted string: %+q\n", placeOfInterest)
fmt.Printf("string的16进制: % x\n", placeOfInterest)
fmt.Printf("string的16进制: %d\n", len(placeOfInterest))

输出结果

只是打印 string: ⌘
quoted string: "\u2318"
string的16进制: e2 8c 98

获取很懵逼,但是看下面一段代码

	// 我们将 e2 8c 98 的 16进制化为10进制  
	fmt.Printf("%s\n", []byte{226, 140,152 })

输出:

意味着 ⌘ 这个字符的 unicode编码为 U+2318, 代表的字节为 e2 8c 98 这意味着这些字节的 utf-8 编码为 2318

rune

rune 在 go 中是 int32 别名。 是为了解决 utf-8 中编码不一致的问题。用 int32 去直接存储 code-point (码点) ,即为rune 。来表示一个 utf-8的编码。

例如:
的 unicode 的值为 \u2318。
那么, 将 2318 为16进制,化为10进制后就为 8984

	var rn rune = 8984
	fmt.Printf("rune=%q\n", rn)

输出结果即为

官方文档 介绍 strings

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值