[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;
}
```