前言
在 Go 中 单引号与双引号并不是等价的。 单引号用来表示 字符,双引号用来表示字符串。
Go语言的字符有以下两种:
- 一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
- 另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。
下面详细介绍一下字符和字符串类型。
byte
占用 1 个节字,也就是 8 个比特位,所以它和 uint8 类型本质上没有区别,它表示的是 ACSII 表中的一个字符。
如下这段代码,分别定义了 byte 类型和 uint8 类型的变量 a 和 b。
|
|
在 ASCII 表中,由于字母 A 的ASCII 的编号为 65 ,字母 B 的 ASCII 编号为 66,所以上面的代码也可以写成这样:
|
|
上面两段代码输出的结果都一样,所以 byte 和 uint8 类型本质上没有却别。
rune
占用 4 个字节,共 32 位比特位,所以它和 int32 本质上也没有区别。它表示的是一个 Unicode 字符( Unicode 是一个可以表示世界范围内的绝大部分字符的编码规范)由于 byte 类型能表示的值是有限,只有 2^8=256 个。当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。
|
|
不管是 byte 还是 rune ,都是使用单引号,而没使用双引号。
单引号用来表示字符,在上面的例子里,如果你使用双引号,就意味着你要定义一个字符串,赋值时与前面声明的前面会不一致,这样在编译的时候就报错: cannot use "B" (type untyped string) as type rune in assignment
byte 和 uint8 没有区别,rune 和 int32 没有区别,那为什么还要多出 byte 和 rune 类型呢?
因为 uint8 和 int32 ,直观上让人以为这是一个数值,但是实际上,它也可以表示一个字符,所以为了消除这种直观错觉,就诞生了 byte 和 rune 这两个别名类型。
string
string 类型介绍
Go 语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8 编码。 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符,例如:
|
|
golang中的字符串底层实际上是一个 byte 数组。因此可能会出现下面这种情况:
|
|
我们期望得到的结果应该是 8,原因是 golang 中的 string 底层是由一个 byte 数组实现的,而 golang 默认的编码是 utf-8,一个中文字符占 3 个字节,所以得到的长度是 12,想要得到我们想要的结果也很简单,golang 中的 unicode/utf8 包提供了用 utf-8 获取长度的方法:
|
|
上面说了 byte 类型实际上是一个 int8 类型,int8 适合表达 ascii 编码的字符,而 int32 可以表达更多的数,可以更容易的处理 unicode 字符。因此,我们可以通过rune类型来处理unicode字符:
|
|
注意:这里 str2 拿到的是一个 rune 切片类型的引用。
这里实际上是申请一块内存将 str 的内容复制到这块内存,这块内存是一个 rune 类型的切片,而 str2 拿到的则是一个 rune 类型的切片的引用,我们可以通过如下代码证明这里的 str2 一个引用:
|
|
通过把 str2 赋值给 t,t 上改变的数据,实际上是改变的是 t 指向的 rune 切片,因此,str 也会跟着改变。
string 类型的遍历
|
|
修改字符串
要修改字符串,需要先将其转换成 []rune 或 []byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。
|
|
字符串转义符
Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等。如下所示:
| 字符 | 注释 |
|---|---|
\a |
响铃 |
\b |
退格 |
\f |
换页 |
\n |
换行 |
\r |
回车 |
\t |
制表符 |
\v |
垂直制表符 |
\' |
单引号 (只用在 ‘'’ 形式的rune符号面值中) |
\" |
双引号 (只用在 “…” 形式的字符串面值中) |
\\ |
反斜杠 |
例如:
- 单行字符
|
|
- 多行字符串
Go语言中要定义一个多行字符串时,就必须使用反引号字符:
|
|
反引号间换行将被作为字符串中的换行,但是 所有 的转义字符均无效,文本将会原样输出。
参考链接
- 原文作者: cathay
- 原文链接: https://blog.chenguotai.com/go-byte-rune-string.html
- 版权声明:本作品采用 署名-非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
