go语言---map

https://blog.csdn.net/cyk2396/article/details/78890185

一.map的用法:

type PersonDB struct {
Id string
Name string
Address string
} fmt.Println("=========Map===========")
//map是一堆键值对的未排序集合,在golang中是内置类型,可以直接使用,不像Java需要引入HashMap
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)

输出结果:

fatal error: concurrent map writes

由结果可知:map不是线程安全的。

至于为什么不是线程安全,以后再分析

三.map传值还是传引用?

运行以下代码:

//map传值还是传引用? map和slice,channel一样,内部都有一个指向真正存储空间的指针,所以,即使传参时是对值的复制(传值),但都指向同一块存储空间。
var myMapV map[string]int
var myMap1 map[string]int
myMapV = map[string]int{"value": 0}
myMap1 = myMapV
fmt.Println("m =", myMapV)
fmt.Println("m1 =", myMap1)
myMap1["value"] = 1
fmt.Println("m =", myMapV)
fmt.Println("m1 =", myMap1)

二.map是线程安全的吗?

运行以下代码:


//map不是线程安全的。
cMap := make(map[string]int)
for i := 0; i < 100; i++ {
go func() {
for j := 0; j < 100; j++ {
cMap[fmt.Sprintf("%d", j)] = j //fatal error: concurrent map writes
}
}()
}
time.Sleep(3 * time.Second)

输出结果:

m = map[value:0]

m1 = map[value:0]

m = map[value:1]

m1 = map[value:1]

我们发现,当修改了m1,m也随着改变了,这看似是传引用,但其实map也是传值的,它的原理和数组切片类似。map内部维护着一个指针,该指针指向真正的map存储空间。我们可以将map描述为如下结构:

type map[key]value struct{

impl *Map_K_V

}

type Map_K_V struct{

//......

}

其实,map和slice,channel一样,内部都有一个指向真正存储空间的指针,所以,即使传参时是对值的复制(传值),但都指向同一块存储空间。

go语言---map的更多相关文章

  1. Go语言Map的使用

    Go 语言Map(集合) Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值. Map 是一种集合,所以我们可以像迭代数组和切片那样 ...

  2. Go 语言 map (映射)

    1.Go 语言中 map 的定义及初始化: map[Key_Type]Value_Type scence := make(map[string]int) 2.Go 语言的遍历: scene := ma ...

  3. Go语言 map的实现

    Go中的map在底层是用哈希表实现的,你可以在 $GOROOT/src/pkg/runtime/hashmap.goc 找到它的实现. 数据结构 哈希表的数据结构中一些关键的域如下所示: struct ...

  4. Go语言 map遍历

    1 遍历顺序 Go语言里的map,是不保证遍历顺序的(这一点很好理解).甚至同样内容的map,两次遍历的顺序,也可能不一样.下面是一个例子: m := map[string]int{"a1& ...

  5. 【转】GO语言map类型interface{}转换踩坑小记

    原文:https://www.az1314.cn/art/69 ------------------------------------------ mapA := make([string]inte ...

  6. Go 语言Map(集合)

    Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值. Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它.不过,Map 是无 ...

  7. go语言map操作

    package main import "fmt" func main() { var m = map[int]string{ 90: "优秀", 80: &q ...

  8. Go语言map

    map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典.这是一种快速寻找值的理想结构:给定 k ...

  9. Go语言map映射的基本操作

    对比python, java都有对应的字典类型及哈希类型. package main import ( "fmt" ) //main is the entry of the pro ...

随机推荐

  1. Go:错误处理

    在默认情况下,当程序发生错误(panic)后,程序就会退出(崩溃),所以我们希望,当程序发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行.比如捕获到错误后,打入日志或给管理员一个提示(邮件 ...

  2. jQuery对table排序

    <script> //col对应列,cmp两数比较方法,返回值为TRUE,FALSE function sort(col, cmp) { var table = $("#test ...

  3. MySQL-----改

    改 **修改用户名** rename user 'username'@'IP address' to 'new username'@'IP address'; **修改密码** set passwor ...

  4. LeetCode(49)Group Anagrams

    题目 Given an array of strings, group anagrams together. For example, given: ["eat", "t ...

  5. linux中的命令

    1,ln-链接 功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是: ln -s 源文件 目标文件  // -s 是 symbolic(符号,象征)的意思. l ...

  6. Analyzer原理

    [常用分词器] SimpleAnalyzer StopAnalyzer WhitespaceAnalyzer StandardAnalyze [TokenStream] she is a studen ...

  7. [cf360 div1.C]The Values You Can Make[Dp]

    题意:有n个硬币,面值不同,求能组成K的方案中,每个方案的硬币可以凑成那些答案. 例如, K=5 面值={1,1,1,2,3} K={1,1,1,2} K={1,1,3} K={2,3} 那么答案是 ...

  8. 【ZJOI2017 Round1练习】D8T3 stone(Nim游戏)

    题意: 思路:与其类似的题是HDU5996 HDU5996为判定性问题,稍加改动就可以用来统计方案数 ..]of longint; v,cas,i,j,ans,tmp,n,s,k:longint; b ...

  9. 自定义View实现跟随手指的小球

    package com.pingyijinren.test; import android.content.Context; import android.graphics.Canvas; impor ...

  10. poj_3006_Dirichlet's Theorem on Arithmetic Progressions_201407041030

    Dirichlet's Theorem on Arithmetic Progressions Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...