2019-11-29

[toc]

#?<font?size=6>golang內(nèi)置類型的底層數(shù)據(jù)結(jié)構(gòu)

##?<font?size=5>slice切片?</font>

```go

//[]int16

type?=?struct?[]int16?{

????int16?*array;

????int?len;

????int?cap;

//[]byte

type?=?struct?[]uint8?{

????uint8?*array;

????int?len;

????int?cap;

}

```

?-?slice中?array?是一個指針,它指向的是一個Array

?-?len?代表的是這個slice中的元素長度

?-?cap?是slice的容量

###??<font?size=4>特性</font>

slice的Array存儲在**連續(xù)內(nèi)存**上:

?1.?隨機(jī)訪問很快,適合用下標(biāo)訪問,緩存命中率會高。

?2.?動態(tài)擴(kuò)容時會涉及到內(nèi)存拷貝和開辟新內(nèi)存,會帶來gc壓力、內(nèi)存碎片化。

?3.?如果知道所需空間,提前分配cap是很好的。

?4.?新、老?slice?共用底層數(shù)組,對底層數(shù)組的更改都會影響到彼此。

?5.?append可以掰斷新老slice共用底層數(shù)組的關(guān)系。(不理解?可以參考擴(kuò)容原理)

##?<font?size=5>string字符串</font>

```go

//string

type?=?struct?string?{

????uint8?*str;

????int?len;

}

```

##?<font?size=5>map</font>

```go

//map[int16]byte

type?=?struct?hash<int16,?uint8>?{

????int?count;

????uint8?flags;

????uint8?B;

????uint16?noverflow;

????uint32?hash0;

????struct?bucket<int16,?uint8>?*buckets;

????struct?bucket<int16,?uint8>?*oldbuckets;

????uintptr?nevacuate;

????runtime.mapextra?*extra;

}?*

```

##?<font?size=5>interface接口類型</font>

```go

//interface

type?=?struct?runtime.eface?{

????runtime._type?*_type;

????void?*data;

}

```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容