Golang 中使用多維 map

2021-07-11 16:05:03 字數 1761 閱讀 4089

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
換句話說,每次建立乙個一維 map 都要 make() 一次,不然就會 panic. 多維 map 沒加一層都要多 make() 好幾次.

Golang 中使用多維 map

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

Golang 在Golang中使用json

由於要開發乙個小型的web應用,而web應用大部分都會使用json作為資料傳輸的格式,所以有了這篇文章。包引用import 用於存放資料的結構體type mydata struct這裡需要注意的就是後面單引號中的內容。json item 這個的作用,就是name欄位在從結構體例項編碼到json資料格...

golang 中 map 的使用

golang 中 map 的初始化方式 1 先宣告 map var m1 map int int 再使用make函式建立乙個非nil的map,nil map不能賦值 m1 make map int int 賦值 m1 66 55fmt.println m1 map 66 55 2 直接 make 建...