引入
- OK,计算机中使用0和1存储所有数据,对于数字,容易理解,通过二进制可以表示和存储。那么字符串呢?
- 首先的解决方法是,定义一个字符集,比如OK我是夏洛,分别对六个字符进行对应编码。
- 所以最初的ASCII字符集出现了,不过由于较早,所以很多字符没收入,比如中文,经过一系列增加修订,一直有很多字符集出现。最终Unicode出现,制霸统一,实现跨语言,跨平台的文本转换和处理。
如何划分
- 好了,编码解决了,如何读取?一长串内容该怎么划分?
- 首先的解决办法是,每一个字符都使用固定长度进行编码,可行,也就是定长编码,但是占用空间太大,浪费资源。然后,变长编码出现,类似IPV4地址划分,使用前几位进行标识,比如0-127使用一个字节,首位为0;128~2047使用两个字节,首位分别为110、10;2048-65535使用三个字节,首位分别为1110、10、10。OK,问题解决。
- 这也就是UTF-8编码所使用的方法。
如何结尾
- 现在开始存储字符串,读取的时候可以通过地址找到字符串开头,那么结尾呢?难道一直无边界的读下去?
- C语言老大哥首先说话,“来,我直接每个字符串后面跟个
\0
,这就规定了字符串边界,不过这样每个字符串就不能包含\0
了,或者通过一些磨磨唧唧的手段。 - 而主角GO语言呢?直接在存储地址内容的后面直接加入长度信息,以字节为单位计数。
附加内容:GO语言中的string
- GO语言中的string是不可对单独字符修改的,即不可使用
s1[0]='h'
这种语句,因为字符串是只读类型,是共用底层字符串的,一个修改,一起共用的变量会受影响。 - 可以通过将字符串转为
[]byte
或者[]rune
,直接修改整个字符串也可以。这时都会创建一个新的内存空间,然后将string的值copy过去。