likes
comments
collection
share

Golang底层原理解析(1)——String这玩意有啥可说的

作者站长头像
站长
· 阅读数 16

生命不息,学习不止

题外话

本人因为种种原因(说来听听),放弃大学学的java,走上了golang这条路,本着干一行爱一行的情怀,做开发嘛,不能只会使用这门语言,所以打算开一个底层原理系列,深挖一下,狠狠的掌握一下这门语言

废话不多说,上货

Golang底层原理解析(1)——String这玩意有啥可说的

String底层

既然研究底层,那就得全方面覆盖,必须先搞一下基础的东西,那必须直接基本数据类型走起啊,

字符串String的底层我看就很基础

string大家应该都不陌生,go中的string是所有8位字节字符串的集合,且初始化后值不可变

string可以为空,但是不能为nil(这句话可以在源码中找到)

string的源码在runtime包下的string.go文件中

可以看到string的底层是一个32位的byte切片

Golang底层原理解析(1)——String这玩意有啥可说的

这时候指定有小伙伴就得问了,既然是byte切片,那我为什么不能修改字符串中某一个元素呢?就像下面这种情况

Golang底层原理解析(1)——String这玩意有啥可说的

因为string底层的byte切片是一个只读切片,主要原因在golang的编译阶段,string会被分配到只读段,指向的数据地址无法写入,也就不能更改

stringStruct结构

同样也对应了string底层的type - stringStruct

提到stringStruct就要提到底层的另一个方法gostringnocopy,如下

Golang底层原理解析(1)——String这玩意有啥可说的

通过这个方法就能明白我们创建字符的时候其实是通过该方法将底层byte转换为string

这里就用到了stringStruct类型,结构如下

Golang底层原理解析(1)——String这玩意有啥可说的

str 是指针,指向了字符串的首地址,而len则是字符串的长度,大概结构就像下面这张图一样

Golang底层原理解析(1)——String这玩意有啥可说的

你们不好奇为什么还存了一个len记录字符长度嘛,我好奇,我查了

当我们获取字符串长度的时候,要遍历整个字符串,有了这个就不用了,直接获取,时间复杂度O(1)

你以为结束了

下一篇我们讲一下gostringnocopy方法和涉及到的包

Golang底层原理解析(1)——String这玩意有啥可说的

大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划! Golang底层原理解析(1)——String这玩意有啥可说的