[Go] GO中的字符串底层数据结构

一个字符串是一个不可改变的字节序列,字符串一般是用来包含人类可读的文本数据。和数组不一样的是,字符串的元素不可修改,是一个只读的字节数组。每一个字符串的长度虽然也是固定的,可是字符串的长度并非字符串类型的一部分。因为Go语言的源代码要求是UTF8编码,致使Go源代码中出现的字符串面值常量通常也是UTF8编码的。源代码中的文本字符串一般被解释为采用UTF8编码的Unicode码点(rune)序列。数组

字符串的底层数据结构:数据结构

type StringHeader struct {
    Data uintptr
    Len  int
}

字符串结构由两个信息组成:第一个是字符串指向的底层字节数组,第二个是字符串的字节的长度。字符串实际上是一个结构体,所以字符串的赋值操做也就是reflect.StringHeader结构体的复制过程,并不会涉及底层字节数组的复制函数

下面是"hello, world"的内存结构:ui

 

 下面是"Hello, 世界"的内存结构:编码

 

里面的中文部分是0xE4 0xB8 0x96 0xE7 0x95 0x8C 这六个字节 , 16进制表示的spa

内置的len函数能够返回一个字符串中的字节数目(不是rune字符数目) code

rune是utf8编码的每个的字符blog

 

由于要维护字符串的只读属性 , 字符串相关的强制类型转换主要涉及到[]byte和[]rune两种类型, 每一个转换均可能隐含从新分配内存的代价,最坏的状况下它们的运算时间复杂度都是O(n)内存

相关文章
相关标签/搜索