Golang 中使用多维 map
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相关推荐
- golang中的二维数组和二维切片
golang中数组和切片用的比较多,下面给个demo看看二维的数组和二维切片. package mainimport ("fmt" )func printarray(a [2][2 ...
- golang 中 map 排序
golang 中没有专门的 map 排序函数,且 map 默认是无序的,也就是你写入的顺序和打印的顺序是不一样的. m := make(map[string]string, 0) m["on ...
- golang 中 map 转 struct
golang 中 map 转 struct package mainimport ("fmt""github.com/goinggo/mapstructure" ...
- 记一次golang中sync.Map并发创建、读取的问题
记一次golang中sync.Map并发创建.读取的问题 cunfate https://www.jianshu.com/p/f472e79909bc 背景: 我们有一个用go做的项目,其中用到了z ...
- golang中如何比较struct,slice,map是否相等以及几种对比方法的区别
一.前言 对比两个struct或者map,slice是否相等是大家经常会有的需求,想必大家也都接触过很多对比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等. 这么多 ...
- 1.13 golang中的Map
1. Map map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用. 1.1.1. map定义 Go语言中 map的定义语法如下 map[KeyType ...
- Golang中的自动伸缩和自防御设计
Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...
- golang中的nil
golang中的nil与其他语言中的语义是一样的,就是代表引用类型的默认值,但是不一样的是, golang中有多种引用类型:pointer.interface.slice.map,channel, f ...
- Go实战--golang中使用redis(redigo和go-redis/redis这个已测试)
自己做测试了没有问题,虚拟机连不上可以把包下载到本地. 版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.csdn.net/wangshubo1989/article/de ...
- floatmap 二维数组_用J中的多维数组进行Arrays.fill
用J中的多维数组进行Arrays.fill 如何在不使用循环的情况下用Java填充多维数组? 我试过了: double[][] arr = new double[20][4]; Arrays.fill ...
最新文章
- android下使用tcpdump抓包
- 1119: 零起点学算法26——判断奇偶数
- STM32mini使用UCOSII信号量和邮箱实现任务挂起和恢复
- C#(.Net)中调用Sql sever汉字字符串显示为?问号
- CSS的一些零碎总结
- 基于python的智能安防系统_基于Python语言的智能家居系统研究
- C++scoket编程(三):3.8 TCPserver开启多线程并发
- java中的criteria_java-jpa-criteriaBuilder使用入门
- python中的pickle解析
- elman神经网络的实现
- 域名IP段批量生成器源码
- xcode9 免证书调试
- Adobe系列软件-快捷键(PS-Photoshop、PR-Premiere Pro、AE-After Effects)
- X86服务器及“机架、塔式、刀片”三类服务器分类
- NERO刻录ISO镜像图解教程
- 马来酰亚胺和琥珀酰亚胺交联剂Sulfo-SMCC,CAS:92921-24-9的溶解性介绍
- ascii转utf8 php,PHP 将ASCII转换为UTF-8编码
- android webview实现拍照
- python| requests 访问 https网站
- R语言查看对象的结构:class函数、mode函数、str函数、names函数