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 ...
随机推荐
- linux下mysql的安装与使用
一.mysql的安装 之前搭建linux下项目的发布,最后遗留的问题时数据库的迁移,如何从windows上迁移到linux上?这里首先进行mysql数据库的安装 1.下载mysql安装包 在这里下载的 ...
- 一个关于vue+mysql+express的全栈项目(一)
最近学了mysql数据库,寻思着能不能构思一个小的全栈项目,思来想去,于是就有了下面的项目: 先上几张效果图吧 目前暂时前端只有这几个页面,后端开发方面,有登录,注册,完善用户信息,获取用 ...
- POJ-20407Relatives/NYOJ-333mdd的烦恼,欧拉函数简单应用,模板A
poj Relatives Time Limit: 1000MS Memory Li ...
- [转]MySQL5字符集支持及编码研究
前言 在更新数据库时,有时会遇到这样的错误: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (utf8_general_ci,COER ...
- Java 读取Excel内容并保存进数据库
读取Excel中内容,并保存进数据库 步骤 建立数据库连接 读取文件内容 (fileInputStream 放进POI的对应Excel读取接口,实现Excel文件读取) 获取文件各种内容(总列数,总行 ...
- java基础标识符,关键字,常量
1关键字1.1关键字的概述Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名.2标识符2.1什么是标识符就是程序员 ...
- Linux 网络配置,ifconfig不显示ip地址的解决办法
进入到/etc/sysconfig/network-scripts 然后设置虚拟机的网络配置 这样就配置成功了
- CentOS 7 es搭建测试
搭建本地yum repo pass 指定特定repo 安装,比如安装wget.(指定特定repo 是为了从最快的repo安装) yum --disablerepo=\* --enablerepo=os ...
- symfony 使用原始sql
$this->get('database_connection')->fetchAll('select * from book where book.id=3')
- NA路由①
Cisco设备的端口: 在Cisco的路由器上都有一个带外网管口(Console/AUX): Con口主要用于本地的con线进行本地网管: AUX口主要与Modem连接通过固话 ...