关于golang:为什么-go-中字符串不能用下标访问

在大多数编程语言中,字符串是能够间接通过下标拜访的,然而在应用 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 不能依照下标拜访的原理了

公众号:没有幻想的阿巧 后盾回复 “群聊”,一起学习,一起提高

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据