[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?是一個(gè)指針睛挚,它指向的是一個(gè)Array
?-?len?代表的是這個(gè)slice中的元素長(zhǎng)度
?-?cap?是slice的容量
###??<font?size=4>特性</font>
slice的Array存儲(chǔ)在**連續(xù)內(nèi)存**上:
?1.?隨機(jī)訪問很快,適合用下標(biāo)訪問急黎,緩存命中率會(huì)高扎狱。
?2.?動(dòng)態(tài)擴(kuò)容時(shí)會(huì)涉及到內(nèi)存拷貝和開辟新內(nèi)存,會(huì)帶來(lái)gc壓力叁熔、內(nèi)存碎片化委乌。
?3.?如果知道所需空間,提前分配cap是很好的荣回。
?4.?新遭贸、老?slice?共用底層數(shù)組,對(duì)底層數(shù)組的更改都會(huì)影響到彼此心软。
?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;
}
```