教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang map 详解

golang map 详解

发布时间:2022-01-09   编辑:jiaochengji.com
教程集为您提供golang map 详解等资源,欢迎您收藏本站,我们将为您提供最新的golang map 详解资源

<span style="font-family:KaiTi_GB2312; font-size:14px">一.map的用法:</span>

<pre><code class="language-plain">type PersonDB struct { Id string Name string Address string } //map是一堆键值对的未排序集合,在golang中是内置类型,可以直接使用,不像Java需要引入HashMap func main() { var personMap map[string]PersonDB //声明一个map变量,string是键的类型,PersonDB是值的类型 personMap = make(map[string]PersonDB, 10) //创建一个map,初始容量为10 personMap["1"] = PersonDB{Id: "1", Name: "zs", Address: "杭州市滨江区"} //给map元素赋值 personMap["2"] = PersonDB{Id: "2", Name: "ls", Address: "杭州市江干区"} //使用内置函数delete删除personMap中key="1"的元素,如果找不到该key,则什么也不会发生,如果personMap为nil,则抛错 delete(personMap, "1") if value, ok := personMap["2"]; ok { //找到key=2的元素,则ok=true,value为找到的值;否则ok=false fmt.Println(value) } personMap2 := map[string]PersonDB{"3": PersonDB{"3", "ww", "杭州市西湖区"}} //创建并初始化一个map personMap2["4"] = PersonDB{"4", "ll", "杭州市西湖区"} for k, v := range personMap2 { //使用range遍历map中的元素 fmt.Println(k, v) if k == "3" { v.Name = "wwUpdate" personMap2["3"] = v //可更改value值 //以下这种赋值方式会报错,只能对value赋值,不能直接更改其成员变量 // personMap2["3"].Name = "wwUpdate" //cannot assign to struct field personMap2["3"].Name in map } } fmt.Println(personMap2) }</code></pre> <span style="font-family:KaiTi_GB2312; font-size:14px">二.map是线程安全的吗?</span>

<span style="font-family:KaiTi_GB2312; font-size:14px">运行以下代码:</span>

<span style="font-family:KaiTi_GB2312; font-size:14px"/>

<pre><code class="language-plain">func main() { c := make(map[string]int) for i := 0; i < 100; i { go func() { for j := 0; j < 100; j { c[fmt.Sprintf("%d", j)] = j } }() } time.Sleep(3 * time.Second) fmt.Println(c) }</code></pre> <span style="font-family:KaiTi_GB2312; font-size:14px">输出结果:</span>

<span style="font-family:KaiTi_GB2312; font-size:14px">fatal error: concurrent map writes</span>

<span style="font-family:KaiTi_GB2312; font-size:14px">由结果可知:map不是线程安全的。
至于为什么不是线程安全,以后再分析</span>

<span style="font-family:KaiTi_GB2312; font-size:14px">三.map传值还是传引用?</span>

<span style="font-family:KaiTi_GB2312; font-size:14px">运行以下代码:</span>

<pre><code class="language-plain">func main() { m := map[string]int{"value": 0} m1 := m fmt.Println("m =", m) fmt.Println("m1 =", m1) m1["value"] = 1 fmt.Println("m =", m) fmt.Println("m1 =", m1) }</code></pre> <span style="font-family:KaiTi_GB2312; font-size:14px">输出结果:</span>

<span style="font-family:KaiTi_GB2312; font-size:14px">m = map[value:0]</span>

<span style="font-family:KaiTi_GB2312; font-size:14px">m1 = map[value:0]
m = map[value:1]
m1 = map[value:1]
我们发现,当修改了m1,m也随着改变了,这看似是传引用,但其实map也是传值的,它的原理和数组切片类似。map内部维护着一个指针,该指针指向真正的map存储空间。我们可以将map描述为如下结构:</span>

<pre><code class="language-plain">type map[key]value struct{ impl *Map_K_V } type Map_K_V struct{ //...... }</code></pre> <span style="font-family:KaiTi_GB2312; font-size:14px">其实,map和slice,channel一样,内部都有一个指向真正存储空间的指针,所以,即使传参时是对值的复制(传值),但都指向同一块存储空间。</span>


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

您可能感兴趣的文章:
golang之map详解
请教一个interface格式解析的问题
golang map 详解
Golang map之reflexivekey函数详解
golang map 锁_golang中线程安全的map
golang map 锁_Golang线程安全的map
Golang的map并发安全
golang 没有名字参数_说说不知道的Golang中参数传递
Golang map的底层实现
golang判断key是否在map中

[关闭]
~ ~