當前位置:編程學習大全網 - 源碼下載 - go map and slice 2021-10-08

go map and slice 2021-10-08

golang是值傳遞,什麽情況下都是值傳遞

那麽,如果結構中不含指針,則直接賦值就是深度拷貝;

如果結構中含有指針(包括自定義指針,以及slice,map等使用了指針的內置類型),則數據源和拷貝之間對應指針會***同指向同壹塊內存,這時深度拷貝需要特別處理。因為值傳遞只是把指針拷貝了

map源碼:

/golang/go/blob/a7acf9af07bdc288129fa5756768b41f312d05f4/src/runtime/map.go

map最重要的兩個結構體: hmap 和 bmap

其中 hmap 充當了哈希表中數組的角色, bmap充當了鏈表的角色。

其中,單個bucket是壹個叫bmap的結構體.

Each bucket contains up to 8 key/elem pairs.

And the low-order bits of the hash are used to select a bucket. Each bucket contains a few high-order bits of each hash to distinguish the entries within a single bucket.

hash值的低位用來定位bucket,高位用來定位bucket內部的key

根據上面bmap的註釋和 /golang/go/blob/go1.13.8/src/cmd/compile/internal/gc/reflect.go ,

我們可以推出bmap的結構實際是

註意:在哈希桶中,鍵值之間並不是相鄰排列的,而是鍵放在壹起,值放在壹起,來減少因為鍵值類型不同而產生的不必要的內存對齊

例如map[int64]int8,如果 key/elem/key/elem這樣存放,那麽int8類型的值就要padding 7個字節***56bits

更多可參考

/p/406751292

/articles/32943

因此,slice、map作為參數傳遞給函數形參,在函數內部的改動會影響到原slice、map

  • 上一篇:過關遊戲源代碼
  • 下一篇:求康熙來了2006年節目表~~
  • copyright 2024編程學習大全網