共计 924 个字符,预计需要花费 3 分钟才能阅读完成。
在大多数编程语言中,字符串是能够间接通过下标拜访的,然而在应用 go 语言的时候,间接应用下标拜访有时候会呈现一些乱码。
<!–more–>
数组
在解决这个问题之前,要先理解一个货色 – 数组: 数组是用于存储多个雷同类型数据的汇合。并且数组在申请内存的时候,是一次申请一块间断的内存。比方咱们创立一个数组,外面存了这几个元素。
因为内存是间断的,元素的类型也是雷同的,所以每个元素占用的内存空间也是固定的,比方 java 中 char 类型占用两个字节。数组的内存空间是平等划分的,这样就能够解释为什么能够靠下标拜访了。
在能够用下标拜访的语言中, 字符串都是依照字符编码的。也就是说,你将字符串“abcd”赋给变量 a, 实质上是创立了一个字符数组用来寄存字符串。然而在 go 语言里不一样,go 语言的字符型是依照字节编码的,什么意思呢?26 个英文字母,每个英文字母占一个字节,在 go 语言的 string 外面就占用一个字节。中文日文韩文就不一样了,go 语言内建只反对 utf8 编码,在 utf8 外面,有一部分汉字占用 3 个字节,一部分汉字占用 4 个字节。比方 “ 巧 ” 这个字,打印一下它的长度,发现这个 string 占用 3 个字节, 加上 “a” 之后占用 4 个字节,应该能了解按字节编码的意思了。
编码
为什么要 go 要抉择依照字节来编码呢,这其实是为了节俭空间。设想一下,在 UTF- 8 编码中,中文有些要三个字节,有一些要占用四个字节,而英文字母只须要占用一个字节。一个中文算一个字符,一个英文字母也算一个字符,然而占用的内存相差很大,假如有一个超长字符串,外面有英文字符远多于中文字符,如果按字符来存储,每个字符要调配四个字节。因为低于四个字节,有可能有些中文就不能失常存储了,在这种状况下,每存储一个英文字母,就要节约三个字节的内存空间。
底层实现和其它语言就不一样,不同类型的字符占用的内存空间都不同,当然也就没有方法依照下标拜访了,不信能够试试。
a[0] 是 97,等于字母 a 的 ascii 码,a[1] 是 229,显然不会是汉字 “ 巧 ” 的 utf8,事实它是 utf8 编码的第一字节的值。
打完出工,到这里弄清楚了 go 中 string 不能依照下标拜访的原理了
公众号:没有幻想的阿巧 后盾回复 “ 群聊 ”,一起学习,一起提高