Go语言底层原理剖析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.1 字符串的本质

在编程语言中,字符串是一种重要的数据结构,通常由一系列字符组成。字符串一般有两种类型,一种在编译时指定长度,不能修改。一种具有动态的长度,可以修改。但是在Go语言中,字符串不能被修改,只能被访问,不能采取如下方式对字符串进行修改。

字符串的终止有两种方式,一种是C语言中的隐式申明,以字符“\0”作为终止符。一种是Go语言中的显式声明。Go语言运行时字符串string的表示结构如下。

其中,Data指向底层的字符数组,Len代表字符串的长度。字符串在本质上是一串字符数组,每个字符在存储时都对应了一个或多个整数,这涉及字符集的编码方式。如下所示,在打印hello world这11个字符时,通过下标输出其十六进制表示的字节数组为68 65 6c 6c 6f 20 77 6f72 6c 64。

Go语言中所有的文件都采用UTF-8的编码方式,同时字符常量使用UTF-8的字符编码集。UFT-8是一种长度可变的编码方式,可包含世界上大部分的字符。上例中的字母都只占据1字节,但是特殊的字符(例如大部分中文)会占据3字节。如下所示,变量b看起来只有4个字符,但是len(b)获取的长度为8,字符串b中每个中文都占据了3字节。