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