![Go语言底层原理剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/131/40795131/b_40795131.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.1 字符串的本质
在编程语言中,字符串是一种重要的数据结构,通常由一系列字符组成。字符串一般有两种类型,一种在编译时指定长度,不能修改。一种具有动态的长度,可以修改。但是在Go语言中,字符串不能被修改,只能被访问,不能采取如下方式对字符串进行修改。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_73_1.jpg?sign=1738880784-lXXOhqZxBw2PTRFZfxIeWZVkpki0yZ2X-0-6266a94a33e00e6faebe6727ea8e9ac8)
字符串的终止有两种方式,一种是C语言中的隐式申明,以字符“\0”作为终止符。一种是Go语言中的显式声明。Go语言运行时字符串string的表示结构如下。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_73_2.jpg?sign=1738880784-C8uiw39JlmXi3N99jVo8XDnFnEnH1TWS-0-c4a346c86064d1ac0ebd35e3fe866408)
其中,Data指向底层的字符数组,Len代表字符串的长度。字符串在本质上是一串字符数组,每个字符在存储时都对应了一个或多个整数,这涉及字符集的编码方式。如下所示,在打印hello world这11个字符时,通过下标输出其十六进制表示的字节数组为68 65 6c 6c 6f 20 77 6f72 6c 64。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_74_1.jpg?sign=1738880784-Eor9bbRVlhkVFuVG8cIuhr3oBm0UNkx1-0-d408ee4645809392e4577dc89911ee02)
Go语言中所有的文件都采用UTF-8的编码方式,同时字符常量使用UTF-8的字符编码集。UFT-8是一种长度可变的编码方式,可包含世界上大部分的字符。上例中的字母都只占据1字节,但是特殊的字符(例如大部分中文)会占据3字节。如下所示,变量b看起来只有4个字符,但是len(b)获取的长度为8,字符串b中每个中文都占据了3字节。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_74_2.jpg?sign=1738880784-vWVUTT2tBtdacocObrAXAQGy87Oty0Hm-0-decaf301febdff9573c0b5149c0cc731)