map的容量的獲取

2021-09-07 20:28:12 字數 1210 閱讀 3614

在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...