Go 语言字符(byte与rune)

更新时间 2022-03-31 14:50:01

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

Go 语言中,字符串 的每一个元素叫做字符,主要分为以下两种:

  • 1、uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。

    提示:byte 类型是 unit8 的别名。

  • 2、rune 类型,代表了一个 UTF-8 字符。通常情况下,当需要处理中文、日文、韩文等复合字符时,需要用到 rune 类型。

我们可以在 fmt.Println 中通过 %T 来输出变量的实际类型,代码如下:

package main

import "fmt"

func main()  {
	var a byte = 'q'
	fmt.Printf("%d %T\n", a, a) // byte 的实际类型其实是个 uint8, 对应的 ASCII 编码为 113

	var b rune = '犬'
	fmt.Printf("%d %T\n", b, b) // rune 的实际类型其实是 int32, 对应的 Unicode 编码为 29356
}

代码输出如下:

113 uint8
29356 int32

图示:

go语言字符代码示例go语言字符代码示例

得出结论:

  • byte 的实际类型其实是个 uint8, 对应的 ASCII 编码为 113;
  • rune 的实际类型其实是 int32, 对应的 Unicode 编码为 29356;

Go 语言中,使用了 rune 类型来处理 Unicode 编码,这样让基于 Unicode 的文本处理更为方便,同时也可以用 byte 进行默认的字符串处理,这样对性能和拓展性都有照顾。

UTF-8 和 Unicode 有何区别?

Unicode 与 ASCII 都是一种字符集。

字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如 q 字符在 Unicode 与 ASCII 中的编码都是 113。汉字“犬”在 Unicode 中的编码为 29356,在不同国家的字符集中,字符所对应的 ID 也会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。

UTF-8 是编码规则,将 Unicode 中的字符 ID 以某种方式进行编码。UTF-8 是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:

  • 0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。
  • 从 128 到 0x10ffff 表示其他字符。

在这种规则之下,拉丁文语系的字符编码一般情况下, 每个字符占用一个字节,而中文每个字符占用 3 个字节。