Golang 快速刪除map所有元素

2021-09-24 13:14:39 字數 1327 閱讀 8122

重新申請乙個新的map,舊的map交給gc去**。

a := make(map[string]int)

a["a"] = 1

a["b"] = 2

// clear all

a = make(map[string]int)

通過go的內部函式mapclear方法刪除。這個函式並沒有顯示的呼叫方法,當你使用for迴圈遍歷刪除所有元素時,go的編譯器會優化成go內部函式mapclear。

package main

func main()

}

把上述源**直接編譯成彙編(預設編譯是會優化的):

go tool compile -s map_clear.go
可以看到編譯器把原始碼9行的for迴圈直接優化成了mapclear去刪除所有元素。如下:

再來看看關閉優化後的結果:

go tool compile -l -n -s map_clear.go
關閉優化選項後,go編譯器直接通過迴圈遍歷來刪除map裡面的元素。

由上可知,遍歷刪除在經過編譯器優化後會呼叫mapclear一次性刪除map所有元素,那這個mapclear函式是如何實現的,效率如何?

這部分**涉及到記憶體管理和gc,只能看懂個大概,後續再補充。

實現思路:

func

mapclear

(t *maptype, h *hmap)

}// 清空bucket

_, nextoverflow :=

makebucketarray

(t, h.b, h.buckets)

...}

func

makebucketarray

(t *maptype, b uint8

, dirtyalloc unsafe.pointer)

(buckets unsafe.pointer, nextoverflow *bmap)

else

else

}...

}

總結:使用mapclear方法清空map時,做的工作就是初始化和釋放申請記憶體塊,效率很高。

golang針對map的判斷,刪除操作示例

map是一種key value的關係,一般都會使用make來初始化記憶體,有助於減少後續新增操作的記憶體分配次數。假如一開始定義了話,但沒有用make來初始化,會報錯的。複製 如下 package main import fmt func main name,ok test 姓名 假如key存在,則...

Oracle中快速刪除所有表資料

一 禁止所有的外來鍵約束 在pl sql developer下執行如下語句 select alter table table name disable constraint constraint name from user constraints where constraint type r 把...

Golang學習筆記 map

字典是一組 無序的 鍵值對 的 集合 字典也叫做 關聯陣列 因為陣列通過 索引 來查詢元素,而字典通過 鍵 來查詢元素。當然,很顯然的,字典的鍵是不能重複的。如果試圖賦值給同乙個鍵,後賦值的值將覆蓋前面賦值的值。字典的定義也有兩種,一種是 初始化資料 的定義方式,另一種是 使用神奇的make函式 來...