在go語言中,有兩個內建函式分別是len(),cap(),前者用於獲取容器的具體內容個數,後者用於獲取容器分配的容量大小,但是這個cap物件是不能獲取到map具體分配的容量大小的。有沒有辦法獲取到呢,辦法是有的,且看下文。
首先我們先使用gdb除錯工具,檢視一下map物件的具體結構是什麼樣子的。
乙個及其簡單的**如下:
package main
func main()
接下來我們編譯這個簡單的**,並進行除錯
# go build -o test -gcflags="-n -l" main.go 這裡goflags是編譯時指定的引數, -n 表示禁止優化,-l表示禁止內聯。 便於除錯使用gdb進行除錯
# gdb test
(gdb) b main.main
breakpoint 1 at 0x401000: file /media/sf_goproject/src/map.go, line 3.
(gdb) r # 開始執行
starting program: /media/sf_goproject/src/test
(gdb) n
m := make(map[string]int)
(gdb) ptype m
type = struct hash
所以b代表了map的容量 既然我們知道了資料的的結構,便可根據結構得到容量的內容。**示例如下。
package main
type hmap struct
func main()
}println("開始刪除------")
for i := 0; i < 10000; i++
}debug.freeosmemory()
c, b = getinfo(m)
fmt.println("釋放後: ", "count: ", c, "b:", b)
}func getinfo(m map[string]string) (int, int)
一些記錄:
1. 在看許多文章中有說到map分配的鍵值被刪除之後,記憶體是不會釋放的。但是在我測試的過程中,發現記憶體是可以釋放的。可能是版本的原因,測試的版本是1.7.1
2. map是非併發安全的,使用過程中需要自己去控制加鎖。
獲取Map集合的資料
傳統方法一 test public voiddemo hashmap map newhashmap map.put 1 aaa map.put 2 bbb map.put 3 ccc setset map.keyset iterator it set.iterator while it.hasnex...
Map獲取鍵值,Map的幾種遍歷方法
map類提供了乙個稱為entryset 的方法,這個方法返回乙個map.entry例項化後的物件集。接著,map.entry類提供了乙個getkey 方法和乙個getvalue 方法,map.entry同時也提供了乙個setvalue 方法,程式設計師可以使用它修改map裡面的值。mapmap ne...
Map獲取鍵值,Map的幾種遍歷方法
map 類提供了乙個稱為entryset 的方法,這個方法返回乙個map.entry例項化後的物件集。接著,map.entry類提供了乙個 getkey 方法和乙個getvalue 方法,map.entry同時也提供了乙個setvalue 方法,程式設計師可以使用它修改map裡面的值。法一 mapm...