教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang映射类型map

Golang映射类型map

发布时间:2022-02-16   编辑:jiaochengji.com
教程集为您提供Golang映射类型map等资源,欢迎您收藏本站,我们将为您提供最新的Golang映射类型map资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

<h3>文章目录</h3> <ul><li><ul><li><ul><li>1. map概述</li><li>2. map定义</li><li><ul><li>2.1 map 声明</li><li>2.2 map初始化</li></ul></li><li>3. map 基本操作</li><li><ul><li>3.1 增 和 改</li><li>3.2 删除</li><li>3.3 查找</li></ul></li><li>4. map遍历</li><li><ul><li>4.1 简单map结构的遍历</li><li>4.2 复杂map结构的遍历</li><li>4.3 map的比较</li></ul></li><li>5. 补充点</li><li><ul><li>5.1 并发读写</li></ul></li></ul></li></ul></li></ul>

<h3>1. map概述</h3> <blockquote>

Go语言中<code>map</code>字典类型时散列表(hash table)的实现,因为Go语言中将map中的每个键都看作与其对应元素的索引,所以同一个map中的键都是唯一的.

映射map功能强大之处在于能够基于键快速检索数据

map类型可以写成map[K]V ,其中所有的key必须是相同类型,所有的value也是相同类型,但是K也V可以是不同类型

</blockquote> <h3>
2. map定义</h3> <h4>2.1 map 声明</h4> <blockquote>

var 变量名 map[key-type]value-type

<ul><li>变量名 : 就是定义一个map类型的变量名称</li><li>key-type : map类型数据键的类型 ,通常为 int ,string类型</li><li>key-value : map类型数据值得类型,可以是int ,string ,bool,map,struct等等</li></ul></blockquote> <blockquote>

map 的声明不会分配内存,初始化需要make,分配内存之后才能使用

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// 声明一个键为int型,值为string型的map</span> <span class="token keyword">var</span> a <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token comment">// 声明一个键为int型,值为float型的map</span> <span class="token keyword">var</span> b <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">float64</span> <span class="token comment">// 声明一个键为string型,值为bool型的map</span> <span class="token keyword">var</span> c <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">bool</span> <span class="token comment">// 声明一个键为string型,值为map[int]string型的map</span> <span class="token keyword">var</span> d <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go map[] map[] map[] map[] </code></pre> <h4>
2.2 map初始化</h4> <blockquote> <ul><li>map 在使用前一定要make</li></ul></blockquote> <blockquote>

初始化方式1

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">var</span> a <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span> a <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">)</span> a<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"a"</span> a<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"b"</span> a<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"e"</span> a<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"c"</span> a<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"f"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"a = "</span><span class="token punctuation">,</span>a<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go a = map[1:a 2:b 3:c 5:e 6:f] </code></pre> <blockquote>

初始化方式2

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// 这种写法显得很冗余</span> <span class="token keyword">var</span> b <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span> <span class="token operator">=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token string">"A"</span> <span class="token punctuation">:</span><span class="token string">"left"</span><span class="token punctuation">,</span> <span class="token string">"D"</span> <span class="token punctuation">:</span><span class="token string">"right"</span><span class="token punctuation">,</span> <span class="token string">"W"</span><span class="token punctuation">:</span><span class="token string">"forward"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">// 简化写法</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"b = "</span><span class="token punctuation">,</span>b<span class="token punctuation">)</span> <span class="token keyword">var</span> b2 <span class="token operator">=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token string">"A"</span> <span class="token punctuation">:</span><span class="token string">"left"</span><span class="token punctuation">,</span> <span class="token string">"D"</span> <span class="token punctuation">:</span><span class="token string">"right"</span><span class="token punctuation">,</span> <span class="token string">"W"</span><span class="token punctuation">:</span><span class="token string">"forward"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"b2 = "</span><span class="token punctuation">,</span>b2<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go b = map[A:left D:right W:forward] b2 = map[A:left D:right W:forward] </code></pre> <blockquote>

初始化方式3

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> c <span class="token operator">:=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token string">"状元"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">:</span><span class="token string">"榜眼"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">:</span><span class="token string">"探花"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code class="lang-go hljs">$ <span class="token keyword">go</span> run main<span class="token punctuation">.</span><span class="token keyword">go</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">:</span>状元 <span class="token number">2</span><span class="token punctuation">:</span>榜眼 <span class="token number">3</span><span class="token punctuation">:</span>探花<span class="token punctuation">]</span> </code></pre> <blockquote>

初始化方式4

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> e <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> e<span class="token punctuation">[</span><span class="token string">"beijing"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"北京"</span> e<span class="token punctuation">[</span><span class="token string">"shanghai"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"上海"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go map[beijing:北京 shanghai:上海] </code></pre> <h3>
3. map 基本操作</h3> <h4>3.1 增 和 改</h4> <blockquote>

map类型数据的增加和修改 ,仅当map中的key不存的时候是新增一个元素,当key存在再给它赋值那就是修改一个key的值了

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> m <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token comment">// 给一个map 新增成员</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"America"</span> m<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"China"</span> m<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Russia"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span> <span class="token comment">// 修改map的数据</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">,</span>m<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> m<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> m<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Germany"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go map[1:America 2:China 3:Russia] map[1:China 2:America 3:Germany] </code></pre> <h4>
3.2 删除</h4> <blockquote>

使用Go语言内建函数delete()删除map中的一组键值

对map执行删除元素操作时安全的,即使元素不存在,delete删除一个不存在元素返回率 0

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> m <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token comment">// 给一个map 新增元素</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"America"</span> m<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"China"</span> m<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Russia"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span> <span class="token comment">//删除map中的一组键值</span> <span class="token function">delete</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code class="lang-go hljs">$ <span class="token keyword">go</span> run main<span class="token punctuation">.</span><span class="token keyword">go</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">:</span>America <span class="token number">2</span><span class="token punctuation">:</span>China <span class="token number">3</span><span class="token punctuation">:</span>Russia<span class="token punctuation">]</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">:</span>China <span class="token number">3</span><span class="token punctuation">:</span>Russia<span class="token punctuation">]</span> </code></pre> <blockquote>

清空map中所有元素,在Go语言中没有直接提供这样的方法和函数,那么清空一个map的唯一途径是重新make一个新的map,让原来的数据块成为"垃圾",由系统的GC执行垃圾回收

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> m <span class="token operator">:=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token string">"北京"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">:</span><span class="token string">"上海"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">:</span><span class="token string">"广州"</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">:</span><span class="token string">"深圳"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span> <span class="token comment">// 清空一个map</span> m <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go map[1:北京 2:上海 3:广州 4:深圳] map[] </code></pre> <h4>
3.3 查找</h4> <blockquote>

在Go语言中map的查找设计的很简洁明确

使用下标来访问map中的元素的元素输出两个值,第一个是访问元素的值,一个是报告元素是否存在的bool值,我们一般将这个bool值命名为 ok

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">var</span> m <span class="token operator">=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token string">"name"</span><span class="token punctuation">:</span><span class="token string">"tom"</span><span class="token punctuation">,</span> <span class="token string">"age"</span><span class="token punctuation">:</span><span class="token string">"99"</span><span class="token punctuation">,</span> <span class="token string">"addr"</span><span class="token punctuation">:</span><span class="token string">"beijing"</span><span class="token punctuation">,</span> <span class="token string">"work"</span><span class="token punctuation">:</span><span class="token string">"programer"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">//判断是否找到特定的键,只需要看第二个参数返回值是true或者false就可以</span> <span class="token comment">//这里的ok是一个变量,用来接收是否找到指定的键的标识</span> name <span class="token punctuation">,</span>ok <span class="token operator">:=</span> m<span class="token punctuation">[</span><span class="token string">"name"</span><span class="token punctuation">]</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>ok<span class="token punctuation">)</span> <span class="token comment">//true</span> <span class="token keyword">if</span> ok<span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token comment">// tom</span> <span class="token punctuation">}</span> <span class="token comment">//上面访问map元素的写法,可以合并成一条语句</span> <span class="token keyword">if</span> addr<span class="token punctuation">,</span>ok <span class="token operator">:=</span> m<span class="token punctuation">[</span><span class="token string">"addr"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> ok<span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>addr<span class="token punctuation">)</span> <span class="token punctuation">}</span> nickname<span class="token punctuation">,</span>yes<span class="token operator">:=</span> m<span class="token punctuation">[</span><span class="token string">"nickname"</span><span class="token punctuation">]</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>yes<span class="token punctuation">)</span> <span class="token comment">// false</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>nickname<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go true tom beijing false </code></pre> <h3>
4. map遍历</h3> <blockquote>

<code>map</code>的遍历通过 <code>for - range</code> 结构来完成

映射map是无序的集合,所以没有办法预测键值对返回的顺序,故而每次迭代map的顺序也可能不一样.

</blockquote> <h4>
4.1 简单map结构的遍历</h4> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> m <span class="token operator">=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"tom"</span><span class="token punctuation">,</span> <span class="token string">"age"</span><span class="token punctuation">:</span> <span class="token string">"99"</span><span class="token punctuation">,</span> <span class="token string">"addr"</span><span class="token punctuation">:</span> <span class="token string">"beijing"</span><span class="token punctuation">,</span> <span class="token string">"work"</span><span class="token punctuation">:</span> <span class="token string">"programmer"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> k<span class="token punctuation">,</span>v <span class="token operator">:=</span> <span class="token keyword">range</span> m<span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"key : %s\t value : %s\n"</span><span class="token punctuation">,</span>k<span class="token punctuation">,</span>v<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go key : addr value : beijing key : work value : programmer key : name value : tom key : age value : 99 </code></pre> <h4>4.2 复杂map结构的遍历</h4> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">var</span> m <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"name"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"tom"</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"age"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"99"</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"addr"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"bejing"</span> m<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> m<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"name"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"lucy"</span> m<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"age"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"88"</span> m<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"addr"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"shanghai"</span> <span class="token keyword">for</span> k<span class="token punctuation">,</span>v <span class="token operator">:=</span> <span class="token keyword">range</span> m<span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"k = "</span><span class="token punctuation">,</span>k<span class="token punctuation">)</span> <span class="token keyword">for</span> k1<span class="token punctuation">,</span>v1 <span class="token operator">:=</span> <span class="token keyword">range</span> v<span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>k1<span class="token punctuation">,</span><span class="token string">"==="</span><span class="token punctuation">,</span>v1<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go k = 1 name === tom age === 99 addr === bejing k = 2 name === lucy age === 88 addr === shanghai </code></pre> <h4>4.3 map的比较</h4> <blockquote>

map和slice 一样是不能进行比较的,唯一能做的比较是和 nil 比较.

要判断两个map是否拥有相同的键和值,必须写循环判断

</blockquote> <blockquote>

示例代码只展示一个思路

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">mapCompare</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> y <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token comment">// 比较长度</span> <span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token function">len</span><span class="token punctuation">(</span>y<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token comment">// 比较键值</span> <span class="token keyword">for</span> k<span class="token punctuation">,</span> xv <span class="token operator">:=</span> <span class="token keyword">range</span> x <span class="token punctuation">{</span> <span class="token keyword">if</span> yv<span class="token punctuation">,</span> ok <span class="token operator">:=</span> y<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token operator">!</span>ok <span class="token operator">||</span> yv <span class="token operator">!=</span> xv <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> xm <span class="token operator">=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"tom"</span><span class="token punctuation">,</span> <span class="token string">"addr"</span><span class="token punctuation">:</span> <span class="token string">"beijing"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> ym <span class="token operator">=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span> <span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"tom"</span><span class="token punctuation">,</span> <span class="token string">"addr"</span><span class="token punctuation">:</span> <span class="token string">"beijing"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">// map 类型只能和nil 直接比较</span> <span class="token keyword">if</span> xm <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token operator">||</span> ym <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"map xm or ym is nil"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"map xm and ym is ok"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// 比较两个map是否拥有相同的键值</span> <span class="token keyword">if</span> ok <span class="token operator">:=</span> <span class="token function">mapCompare</span><span class="token punctuation">(</span>xm<span class="token punctuation">,</span>ym<span class="token punctuation">)</span> <span class="token punctuation">;</span>ok<span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"xm 和 ym 有相同的键和值"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go map xm and ym is ok xm 和 ym 有相同的键和值 </code></pre> <h3>
5. 补充点</h3> <h4>5.1 并发读写</h4> <blockquote>

并发对一个map进行读写操作会引发竞态问题

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> m <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token comment">// 并发函数不断对map进行读写的时候,发生竞态问题</span> <span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> <span class="token boolean">_</span> <span class="token operator">=</span> m<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <pre><code>$ go run main.go fatal error: concurrent map read and map write </code></pre> <blockquote>

面临这样的问题,可以采取的一个方案是使用 sync.Map 这是sync包的一个特殊结构,与map很不同,相比较map 是损失了性能,解决的并发读写问题,如果没有并发读写问题,直接使用map即可

</blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"sync"</span> <span class="token string">"time"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 定义一个sync.Map类型</span> <span class="token keyword">var</span> sm sync<span class="token punctuation">.</span>Map <span class="token comment">// 给 sm 添加元素</span> sm<span class="token punctuation">.</span><span class="token function">Store</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> <span class="token string">"zhangshan"</span><span class="token punctuation">)</span> sm<span class="token punctuation">.</span><span class="token function">Store</span><span class="token punctuation">(</span><span class="token string">"addr"</span><span class="token punctuation">,</span> <span class="token string">"bejing"</span><span class="token punctuation">)</span> sm<span class="token punctuation">.</span><span class="token function">Store</span><span class="token punctuation">(</span><span class="token string">"job"</span><span class="token punctuation">,</span> <span class="token string">"programmer"</span><span class="token punctuation">)</span> <span class="token comment">//获取一个元素</span> name<span class="token punctuation">,</span> ok <span class="token operator">:=</span> sm<span class="token punctuation">.</span><span class="token function">Load</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> ok <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// 删除一个元素(安全删除)</span> sm<span class="token punctuation">.</span><span class="token function">Delete</span><span class="token punctuation">(</span><span class="token string">"nameNone"</span><span class="token punctuation">)</span> <span class="token comment">// 遍历sm中的元素</span> sm<span class="token punctuation">.</span><span class="token function">Range</span><span class="token punctuation">(</span><span class="token keyword">func</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> value <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span><span class="token string">"===>"</span><span class="token punctuation">,</span>value<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">// 测试并发读写使用</span> <span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> t <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Unix</span><span class="token punctuation">(</span><span class="token punctuation">)</span> sm<span class="token punctuation">.</span><span class="token function">Store</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> name<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> sm<span class="token punctuation">.</span><span class="token function">Load</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> 到此这篇关于“Golang映射类型map”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang 映射 map 简介
Golang 映射 声明使用原理及方法
golang map多层嵌套使用及遍历方法汇总
golang map 初始化 和 使用
Go数据类型整理
golang map key 正则表达_Golang中的Map
golang key map 所有_谨慎使用golang中的map
go-反射机制
Golang map类型 复杂map类型
Go 实验报告:函数式编程之泛型

[关闭]
~ ~