美文网首页
为什么 go 中字符串不能用下标访问

为什么 go 中字符串不能用下标访问

作者: 失眠是真滴难受 | 来源:发表于2020-10-21 14:30 被阅读0次

在大多数编程语言中,字符串是可以直接通过下标访问的,但是在使用 go 语言的时候,直接使用下标访问有时候会出现一些乱码。

数组

在解决这个问题之前,要先了解一个东西--数组:数组是用于存储多个相同类型数据的集合。并且数组在申请内存的时候,是一次申请一块连续的内存。比如我们创建一个数组,里面存了这几个元素。

由于内存是连续的,元素的类型也是相同的,所以每个元素占用的内存空间也是固定的,比如 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 码,a1 是 229,显然不会是汉字 "巧" 的 utf8,事实它是 utf8 编码的第一字节的值。

打完收工,到这里弄清楚了 go 中 string 不能按照下标访问的原理了

公众号:没有梦想的阿巧 后台回复 "群聊",一起学习,一起进步

相关文章

  • 为什么 go 中字符串不能用下标访问

    在大多数编程语言中,字符串是可以直接通过下标访问的,但是在使用 go 语言的时候,直接使用下标访问有时候会出现一些...

  • Swift:字符串下标访问与Unicode

    居然不能用整数下标随机访问? 第一次使用Swift字符串之前,已经习惯了C,C++直接通过下标随机访问字符串数组的...

  • Swift 字符串索引访问和修改字符串

    字符串索引 注意,在 Swift 中,字符串的下标并不是 Int 类型,所以不能用 1234 这样的下标来进行获取...

  • python的基本数据类型-字符串1

    字符串类型 声明字符串时 ,在字符串前后加上单引号 或者 双引号 举例: 字符串 下标访问 和 切片访问 字符串 ...

  • 【Go】一个字符串趣题

    @[toc] 问题 给定一个字符串s和一个下标i,返回下标i对应的那个字节所在的字符。 字符串在Go中的底层是by...

  • 关于golang指针的理解与使用

    Go指针理解 Go 有指针,但是没有指针运算。你不能用指针变量遍历字符串的各个字节。在 Go 中调用函数的时候,得...

  • 指针与数组

    基础 方法一:用字符数组定义字符串,用指针访问。 方法二:用指针定义字符串,用数组下标访问。 C语言没有定义字符串...

  • PHP 那些变态的语法 (持续更新)

    下标可以访问字符串中的元素: 可以使用变量代替类名或函数名 强大的timetostr函数:

  • Python Error:TypeError: string i

    原因: 由于当前的’字典’并不是字典,而是字符串。导致了拿字典的访问方法去访问字符串就会出现访问字典的 下标,字典...

  • WIKI | 记一次Python 序列切片操作

    Python 摘:在Python中,序列类型包括字符串、元组、列表。序列就是元素有序排列。通过下标访问,Pytho...

网友评论

      本文标题:为什么 go 中字符串不能用下标访问

      本文链接:https://www.haomeiwen.com/subject/dptemktx.html