Go string底层实现?

题目来源:字节跳动

答案:

源码包 src/runTime/string.go.stringStruct 定义了string的数据结构:

  1. Type stringStruct struct{
  2. str unsafe.Pointer
  3. len int
  4. }

数据结构:

stringStruct.str:字符串的首地址

stringStruct.len:字符串的长度

声明:

如下代码所示,可以声明一个string变量赋予初值:

  1. var str string str = "Hello world"

字符串构建过程是现根据字符串构建stringStruct,再转化成string。转换的源码如下:

  1. func gostringnocopy(str *byte) string{ //根据字符串地址构建string
  2. ss := stringStruct{str:unsafe.Pointer(str),len:findnull(str)} // 先构造 stringStruct
  3. s := *(*string)(unsafe.Pointer(&ss)) //再将stringStruct 转换成string
  4. return s
  5. }