http://tnt.wicast.tk/2015/11/02/golang-multiple-dimension-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]stringm["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"]=1m["a"]=c

这时的 m[“a”] 的值就是另一个 map 了.

多维度 Map 的数据存取

一维情况下的 map 做存取很简单,而二维以上的情况就得小心了. 先来看一个例子:

m:=make(map[string]map[string]int)c:=make(map[string]int)c["b"]=1m["a"]=cd:=make(map[string]int)d["c"]=2m["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"];exist{    m["a"]["c"]=2}else{    c:=make(map[string]int)    c["c"]=2    m["a"]=c}

换句话说,每次创建一个一维 map 都要 make() 一次,不然就会 panic. 多维 map 没加一层都要多 make() 好几次.

最新文章

  1. ASP.NET列表信息以Excel形式导出
  2. java连接mysql数据库详细步骤解析
  3. 记得初学JS时候练个九九乘法表都写的要死要活
  4. MVC中Action 过滤
  5. 使用MapReduce实现一些经典的案例
  6. Firebug在Firefox DevTools 中复活
  7. C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)
  8. [shell基础]——I/O重定向
  9. 动态调整对话框属性(去掉标题栏,去掉边框,修改类似成Border:NONE样式)(调用ModifyStyle和ModifyStyleEx,然后调用SetWindowPos重新显示)
  10. 在浏览器控制台调试php程序
  11. 【转】android 电容屏(三):驱动调试之驱动程序分析篇
  12. quagga源码分析--路由信息处理zebra-rib
  13. sublime中安装package control总是失败
  14. 【前端单元测试入门02】react的单元测试之Enzyme
  15. sorted函数返回一个新的列表就安全了吗?
  16. Android使用局和数据实现天气项目-android学习之旅(十二)
  17. vue Transfer 穿梭框
  18. Flask----基础
  19. UWP 使用Windows Community Toolkit 的OneDrive service上传下载文件
  20. Ansible入门笔记(1)之工作架构和使用原理

热门文章

  1. Java double 精度
  2. Expression表达式树 案例
  3. POJ1222 EXTENDED LIGHTS OUT 高斯消元 XOR方程组
  4. 【洛谷】4180:【模板】严格次小生成树[BJWC2010]【链剖】【线段树维护最大、严格次大值】
  5. 【BZOJ】1415: [Noi2005]聪聪和可可【期望】【最短路】【记忆化搜索】
  6. Codeforces Round #357 (Div. 2) A. A Good Contest 水题
  7. 二值化方法:Kittler:Minimum Error Thresholding
  8. SecureCRT 如何改变对话框--每行输入字符数的多少
  9. vue父子组件、兄弟组件之间的通信和访问
  10. POJ 1330 Nearest Common Ancestors (LCA,dfs+ST在线算法)