go语言---map
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的更多相关文章
- Go语言Map的使用
		Go 语言Map(集合) Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值. Map 是一种集合,所以我们可以像迭代数组和切片那样 ... 
- Go 语言 map (映射)
		1.Go 语言中 map 的定义及初始化: map[Key_Type]Value_Type scence := make(map[string]int) 2.Go 语言的遍历: scene := ma ... 
- Go语言 map的实现
		Go中的map在底层是用哈希表实现的,你可以在 $GOROOT/src/pkg/runtime/hashmap.goc 找到它的实现. 数据结构 哈希表的数据结构中一些关键的域如下所示: struct ... 
- Go语言 map遍历
		1 遍历顺序 Go语言里的map,是不保证遍历顺序的(这一点很好理解).甚至同样内容的map,两次遍历的顺序,也可能不一样.下面是一个例子: m := map[string]int{"a1& ... 
- 【转】GO语言map类型interface{}转换踩坑小记
		原文:https://www.az1314.cn/art/69 ------------------------------------------ mapA := make([string]inte ... 
- Go 语言Map(集合)
		Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值. Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它.不过,Map 是无 ... 
- go语言map操作
		package main import "fmt" func main() { var m = map[int]string{ 90: "优秀", 80: &q ... 
- Go语言map
		map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典.这是一种快速寻找值的理想结构:给定 k ... 
- Go语言map映射的基本操作
		对比python, java都有对应的字典类型及哈希类型. package main import ( "fmt" ) //main is the entry of the pro ... 
随机推荐
- 每日命令:(13)more
			more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ... 
- RNNCell使用
			目录 Recap input dim, hidden dim SimpleRNNCell Single layer RNN Cell Multi-Layers RNN RNN Layer Recap ... 
- JS 去除字符串空格
			$.trim()是jQuery提供的函数,用于去掉字符串首尾的空白字符. "abc 123 def".replace(/\s/g, "") 去除所有的空格 
- Oracle 实现查询不区分大小写(设置数据库)
			转http://blog.csdn.net/shl7765856/article/details/7622756 查询数据的时候. SQL Server 默认 不区分大小写. 如果要区分,就要额外的设 ... 
- 51NOD 2370 奈芙莲的护符
			>>这是原题传送门<< 答案参考来自 http://www.cnblogs.com/sugewud/p/9822933.html 思路:看到取值范围之后,仅有的思路还是暴力 
- HDU 1079 简单博弈
			判断下一步能否到达必胜态,如果可以当前状态就是必败态,否则当前状态记为必胜态 #include <cstdio> #include <cstring> #include < ... 
- 关于struct函数以及重载
			1,关于其函数的应用 我们从这里可以看出,void,int,Node,这三种类型,都是可以定义的. 2,重载的方式 如何重载比较符号 这里的比较重载就是小于号,如果前者x比后者x小就返回真 否则返回假 ... 
- Linux下汇编语言学习笔记10 ---
			这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ... 
- 2017-10-01-afternoon
			T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带 ... 
- java设计模式——单例设计模式
			/*设计模式:对问题行之有效的解决方式.其实它是一种思想. 1,单例设计模式. 解决的问题:就是可以保证一个类在内存中的对象唯一性. 必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的 ... 
