go二維map Golang 中使用多維 map

2021-10-21 08:38:07 字數 1663 閱讀 9139

golang 中使用多維 map

golang 的 xml/json 解析庫乍看使用起來很方便,只要構造一樣結構的 struct 就可以一下子匯入到變數中去了.其實手工構造 struct 非常容易出現結構偏差,而且最要命的是 unmarshal() 執行的時候不是嚴格匯入所以沒有任何報錯.

於是這兩天寫了乙個給 golang 用的 xml to struct 生成器,希望能一勞永逸.

不過在製作過程中有遇到了乙個不太容易發現的坑……也就是標題所說的多維 map.

什麼是 map

首先 golang 中的 map 與 js,py 裡的 map 函式並不是同一回事。前者是 golang 中的一種基礎資料型別,具有 key:value 的特性;而後者的 map 是 mapreduce 中的那個 map,把一組資料分發到其他地方.

使用 map,以及多維 map 的坑

map 的底層就是乙個 hash,平時咱喜歡利用這一點來給一組資料去除重複. 使用 map 的時候需要注意,你需要顯式地初始化才能對 map 進行操作.

var m map[string]string

m["a"]="sssss"

上面的**會報 panic: assignment to entry in nil map ,必須用內建的 make() 函式才行.

m:=make(map[string]string)

m["a"]="sssss"

咱在自己的專案裡用到了乙個二維 map,結果第一遍寫的時候就碰到了那個 nil map 的問題。

一開始的**是這樣的:

m:=make(map[string]map[string]string)

m["a"]["b"]="ccc"

後來才想明白如果插新加入的元素也是個 map 的話需要再次 make()!! 修正後的**如下

m:=make(map[string]map[string]int)

c:=make(map[string]int)

c["b"]=1

m["a"]=c

這時的 m[「a」] 的值就是另乙個 map 了.

多維度 map 的資料訪問

一維情況下的 map 做訪問很簡單,而二維以上的情況就得小心了. 先來看乙個例子:

m:=make(map[string]map[string]int)

c:=make(map[string]int)

c["b"]=1

m["a"]=c

d:=make(map[string]int)

d["c"]=2

m["a"]=d

而這個時候再去查詢 m["a"]["b"] 會發現這個值已經沒有了,取而代之的是 m["a"]["c"].

這是因為 b 和 c 都是 map[string]int 型別的資料,golang 直接把 ["a"] 裡的資料從 b 替換成了 c,而不會遞迴地新增 map 中缺失的資料。

要在 m 中保留 ["a"]["b"] 和 ["a"]["c"],需要一些額外的判斷才行:

if _,exist:=m["a"];existelse{

c:=make(map[string]int)

c["c"]=2

m["a"]=c

換句話說,每次建立乙個一維 map 都要 make() 一次,不然就會 panic. 多維 map 沒加一層都要多 make() 好幾次.

go二維map Golang使用Map的正確姿勢

初始化後再使用 golang中,map是引用型別,如切片一樣,通過下面的 宣告後指向的是nil,所以千萬別直接宣告後就使用,新手可能經常會犯如下錯誤 var m map string string m result result 由於字典是引用型別,所以當我們僅宣告而不初始化乙個字典型別的變數的時候...

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...