Go GO中的字串底層資料結構

2021-10-12 22:03:17 字數 823 閱讀 8916

乙個字串是乙個不可改變的位元組序列,字串通常是用來包含人類可讀的文字資料。和陣列不同的是,字串的元素不可修改,是乙個唯讀的位元組陣列。每個字串的長度雖然也是固定的,但是字串的長度並不是字串型別的一部分。由於go語言的源**要求是utf8編碼,導致go源****現的字串面值常量一般也是utf8編碼的。源**中的文字字串通常被解釋為採用utf8編碼的unicode碼點(rune)序列。

字串的底層資料結構:

type stringheader struct
字串結構由兩個資訊組成:第乙個是字串指向的底層位元組陣列,第二個是字串的位元組的長度。字串其實是乙個結構體,因此字串的賦值操作也就是reflect.stringheader結構體的複製過程,並不會涉及底層位元組陣列的複製

下面是"hello, world"的記憶體結構:

下面是"hello, 世界"的記憶體結構:

裡面的中文部分是0xe4 0xb8 0x96 0xe7 0x95 0x8c 這六個位元組 , 16進製表示的

內建的len函式可以返回乙個字串中的位元組數目(不是rune字元數目) 

rune是utf8編碼的每乙個的字元

因為要維護字串的唯讀屬性 , 字串相關的強制型別轉換主要涉及到byte和rune兩種型別, 每個轉換都可能隱含重新分配記憶體的代價,最壞的情況下它們的運算時間複雜度都是o(n)

Redis 28 底層資料結構字串

sds dynamic string char data abc 字元陣列,c語言字元陣列最後會加個 0,如果字串中包含了 0,資料會出問題 int len 使用len長度,每次修改都需要重新分配長度 int free 用空間換時間預先分配多一點空間,減少重新分配的次數 int 型別佔4個位元組,l...

redis set底層資料結構

redis的集合物件set的底層儲存結構特別神奇,我估計一般人想象不到,底層使用了intset和hashtable兩種資料結構儲存的,intset我們可以理解為陣列,hashtable就是普通的雜湊表 key為set的值,value為null 是不是覺得用hashtable儲存set是一件很神奇的事...

C vector底層資料結構

vector 其底層資料結構是陣列,由於陣列的特點,vector也具有以下特性 1 o 1 時間的快速訪問 2 順序儲存,所以插入到非尾結點位置所需時間複雜度為o n 刪除也一樣 3 擴容規則 當我們新建乙個vector的時候,會首先分配給他一片連續的記憶體空間,如std vector vec,當通...