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 ...
随机推荐
- JS 实现全屏预览 F11功能
老是不通过,没办法,只能是重新发布了,反正我就是杠上了,大大小小写过很多前端特效,当然也经常在网上copy或者修改人家的代码,我觉得也挺好的,为什么?!因为我想这样,你能怎么办,打我?少废话,直接上代 ...
- LeetCode 303. Range Sum Query – Immutable
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- 树剖 lca
GeneralLiu 橙边为轻边 红边为重边 绿数为每个点的 top 橙数为每个点的编号 步骤 1 先预处理 每个点的 deep深度 size子树大小 dad父节点 2 再预处理 每个点的 to ...
- [POJ3463] Sightseeing(次短路 Heap + Dijkstra)
传送门 用dijkstra比较好,spfa可能有的重复 dis[x][2]:dis[x][0]表示起点到x的最短路.dis[x][1]表示起点到x的次短路: tot[x][2]:tot[x][0]表示 ...
- [TyvjP1313] [NOIP2010初赛]烽火传递(单调队列 + DP)
传送门 就是个单调队列+DP嘛. ——代码 #include <cstdio> ; , t = , ans = ~( << ); int q[MAXN], a[MAXN], f ...
- noip模拟赛 道路分组
分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后dfs判断一下1和n是否连通.有向图的判连通没有什么很快的方法,特别注意,并查集是错的!这个算法可以得到60分. 事实上每一次都不需 ...
- [K/3Cloud] 如何代码中动态设置当前活动页签
this.GetControl<TabControl>(key).SelectedIndex=目标Index Ps:如下方式隐藏页签: this.View.GetControl(" ...
- [NOIP2007] 提高组 洛谷P1099 树网的核
题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...
- [bzoj2561]最小生成树_网络流_最小割_最小生成树
最小生成树 bzoj-2561 题目大意:题目链接. 注释:略. 想法: 我们发现: 如果一条权值为$L$的边想加入到最小生成树上的话,需要满足一下条件. 就是求出原图的最小生成树之后,这个边当做非树 ...
- Ubuntu 16.04安装SoapUI工具进行接口测试(Web Service/WSDL/RESTfull)
SoapUI是一个跨平台接口测试工具,官方提供开源版本和商业版本.可以用来测试WSDL/RESTfull等接口. 替代的工具有JMeter. 一般用于WSDL的接口测试比较多,基于XML的形式,且这类 ...