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() 好几次.

Golang 中使用多维 map的更多相关文章

  1. Go_14:GoLang中 json、map、struct 之间的相互转化

    1. golang 中 json 转 struct <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field).也就是说结构体的 key 对应的首字母 ...

  2. Golang中map的三种声明方式和简单实现增删改查

    package main import ( "fmt" ) func main() { test3 := map[string]string{ "one": & ...

  3. GoLang中 json、map、struct 之间的相互转化

    1. golang 中 json 转 struct <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field).也就是说结构体的 key 对应的首字母 ...

  4. 记一次坑爹的golang 二维map判断问题

    记一次坑爹的golang 二维map判断问题 2018年10月18日 23:16:21 yinnnnnnn 阅读数:32更多 个人分类: golang   版权声明:本文为博主原创文章,未经博主允许不 ...

  5. golang 中 map 转 struct

    golang 中 map 转 struct package main import ( "fmt" "github.com/goinggo/mapstructure&qu ...

  6. golang中map原理剖析

    1. golang中的map有自己的一套实现原理,其核心是由hmap和bmap两个结构体实现的 2.  初始化map package main func main() { // 初始化一个可容纳10个 ...

  7. golang中的map

    1. 声明与初始化 // map的声明与初始化 userInfo := map[string]string{"name": "马亚南", "age&q ...

  8. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  9. 【转】 Android 基于google Zxing实现对手机中的二维码进行扫描--不错

    原文网址:http://blog.csdn.net/xiaanming/article/details/14450809 转载请注明出处:http://blog.csdn.net/xiaanming/ ...

随机推荐

  1. [leetcode tree]103. Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  2. JQuery的源码阅读

    探索原理,animation实现,一个对象可以同时绑定多个事件,这是如何实现的? (function(window, undefined) { function jQuery(selector){ r ...

  3. ELK收集openstack日志

    1.安装jdk 每个openstack服务器需要安装jdk,我安装的版本jdk-7u71-linux-x64.rpm 2.安装.配置Elastic Search install https://dow ...

  4. bzoj 3956: Count

    3956: Count Description Input Output Sample Input 3 2 0 2 1 2 1 1 1 3 Sample Output 0 3 HINT M,N< ...

  5. EXECL中怎么中把换行符换成任意字符

    作文本处理的时候,数据是从execl中拷贝出来的,但是execl中是带有格式的. 导出到txt文本中的时候会出现换行,不满足一行一条数据的要求. 公式 =SUBSTITUTE(A1,),"A ...

  6. SLF4J versions 1.4.0 and later requires log4j 1.2.12 or later 终极解决

    http://blog.sina.com.cn/s/blog_54eb26870100uynj.html 到SLF4J官方网站:http://www.slf4j.org/codes.html#log4 ...

  7. Problem A: 象棋比赛

    Description 1月6日,教职工象棋协会在6号楼办了一次比赛,很多老师都参加了.比赛共进行了5轮,赢1局积3分,和了1分,输了0分,你能帮忙算一下各位老师的积分吗? Input 多组测试数据, ...

  8. px em rem 字体单位问题

    px:相对长度单位,相对于屏幕分辨率 em:相对长度单位,相对于body而言 rem:相对长度单位,相对于html根元素 注意:浏览器默认大小:16px;

  9. [Visual Studio] .vsix项目模板制作

    Visual Studio (VSIX,项目模板 )制作   下载Vsiual Studio 2012 SDK 下载地址:http://www.microsoft.com/en-us/download ...

  10. Android证书有效性验证方案

    1.前言: 1.1.SSL劫持攻击:          目前虽然很多Android APP使用了https通信方式,但是只是简单的调用而已,并未对SSL证书有效性做验证.在攻击者看来,这种漏洞让htt ...