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. python 文件内容修改替换操作

    当我们读取文件中内容后,如果想要修改文件中的某一行或者某一个位置的内容,在python中是没有办法直接实现的,如果想要实现这样的操作只能先把文件所有的内容全部读取出来,然后进行匹配修改后写入到新的文件 ...

  2. Centos 安装 WPS

    Linux有自己的一套类是Office的办公软件:LibreOffice,但是不是很友好,幸好WPS有Linux版本. 安装步骤: 1.安装依赖包 yum install libpng12 yum i ...

  3. android view的 绘制流程

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 首先是 从  视图根 这个类的  进行遍历 performTraversals 方法 开 ...

  4. 【贪心】【字典树】Gym - 101466A - Gaby And Addition

    题意:定义一种无进位加法运算,给你n个正整数,问你取出两个数,使得他们加起来和最大/最小是多少. 无进位加法运算,其实是一种位运算,跟最大xor那个套路类似,很容易写出对于每个数字,其对应的最优数字是 ...

  5. PHP 5.5以上 使用 CURL 上传文件

    PHP 5.5以上 使用 CURL 上传文件的代码: curl_setopt(ch, CURLOPT_POSTFIELDS, [ 'file' => new CURLFile(realpath( ...

  6. hashmap的遍历方法

    How to iterate over the entries of a Map? What is the order of iteration - if you are just using Map ...

  7. 【洛谷】2474:[SCOI2008]天平【差分约束系统】

    P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...

  8. Codeforces Round #352 (Div. 1) B. Robin Hood 二分

    B. Robin Hood 题目连接: http://www.codeforces.com/contest/671/problem/B Description We all know the impr ...

  9. LogStash日志分析系统

    简介 通常日志管理是逐渐崩溃的——当日志对于人们最重要的时候,也就是出现问题的时候,这个渐进的过程就开始了.日志管理一般会经历一下3个阶段: 初级管理员将通过一些传统工具(如cat.tail.sed. ...

  10. MySQL的mysql.sock文件作用(转)

    mysql.sock是可用于本地服务器的套接字文件.它只是另一种连接机制. 不包含任何数据,但仅用于从客户端到本地服务器来进行交换数据.