教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang 中使用多维 map

Golang 中使用多维 map

发布时间:2022-01-27   编辑:jiaochengji.com
教程集为您提供Golang 中使用多维 map等资源,欢迎您收藏本站,我们将为您提供最新的Golang 中使用多维 map资源

 

<h1>Golang 中使用多维 map</h1>

 

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 进行操作.

​​​​​​​

<pre class="has"><code class="language-html"> </code></pre> <ol><li>

<code>var m map[string]string</code>

</li><li>

<code>m["a"]="sssss"</code>

</li></ol>

上面的代码会报 <code>panic: assignment to entry in nil map</code> ,必须用内建的 make() 函数才行.

<pre class="has"><code class="language-html"> </code></pre> <ol><li>

<code>m:=make(map[string]string)</code>

</li><li>

<code>m["a"]="sssss"</code>

</li></ol>

咱在自己的项目里用到了一个二维 map,结果第一遍写的时候就碰到了那个 <code>nil map</code> 的问题。
一开始的代码是这样的:

<pre class="has"><code class="language-html"> </code></pre> <ol><li>

<code>m:=make(map[string]map[string]string)</code>

</li><li>

<code>m["a"]["b"]="ccc"</code>

</li></ol>

后来才想明白如果插新加入的元素也是个 map 的话需要再次 make()!! 修正后的代码如下

<pre class="has"><code class="language-html"> </code></pre> <ol><li>

<code>m:=make(map[string]map[string]int)</code>

</li><li>

<code>c:=make(map[string]int)</code>

</li><li>

<code>c["b"]=1</code>

</li><li>

<code>m["a"]=c</code>

</li></ol>

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

多维度 Map 的数据存取

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

<pre class="has"><code class="language-html"> </code></pre> <ol><li>

<code>m:=make(map[string]map[string]int)</code>

</li><li>

<code>c:=make(map[string]int)</code>

</li><li>

<code>c["b"]=1</code>

</li><li>

<code>m["a"]=c</code>

</li><li>

<code>d:=make(map[string]int)</code>

</li><li>

<code>d["c"]=2</code>

</li><li>

<code>m["a"]=d</code>

</li></ol>

而这个时候再去查询 <code>m["a"]["b"]</code> 会发现这个值已经没有了,取而代之的是 <code>m["a"]["c"]</code>.
这是因为 b 和 c 都是 <code>map[string]int</code> 类型的数据,Golang 直接把 <code>["a"]</code> 里的数据从 b 替换成了 c,而不会递归地添加 map 中缺失的数据。
要在 m 中保留 <code>["a"]["b"]</code> 和 <code>["a"]["c"]</code>,需要一些额外的判断才行:

<pre class="has"><code class="language-html"> </code></pre> <ol><li>

<code>if _,exist:=m["a"];exist{</code>

</li><li>

<code>m["a"]["c"]=2</code>

</li><li>

<code>}else{</code>

</li><li>

<code>c:=make(map[string]int)</code>

</li><li>

<code>c["c"]=2</code>

</li><li>

<code>m["a"]=c</code>

</li><li>

<code>}</code>

</li></ol>

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

到此这篇关于“Golang 中使用多维 map”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang 中使用多维 map
golang map多层嵌套使用及遍历方法汇总
Golang从入门到放弃200618--Map(1)Map的初始化和基本操作
golang中map声明及初始化
golang map中结构体元素是无法取地址的
golang 初始化并赋值_golang语言中map的初始化及使用示范
golang map 详解
Golang 中使用 Slice 索引 Map 替代 Map 获得性能提升
golang map
golang 并发访问map遇到的问题

[关闭]
~ ~