在 Go 语言里面,map 一种无序的键值对, 它是数据结构 hash 表的一种实现方式,类似 Python 中的字典。
使用关键字 map 来声明形如:
map[KeyType]ValueType
注意点:
==
var cMap map[string]int // 只定义, 此时 cMap 为 nil fmt.Println(cMap == nil) cMap["北京"] = 1 // 报错,因为 cMap 为 nil
make
cMap := make(map[string]int) cMap["北京"] = 1 // 指定初始容量 cMap = make(map[string]int, 100) cMap["北京"] = 1
说明:在使用 make 初始化 map 的时候,可以指定初始容量,这在能预估 map key 数量的情况下,减少动态分配的次数,从而提升性能。
cMap := map[string]int{"北京": 1}
cMap := map[string]int{} cMap["北京"] = 1 //写 code := cMap["北京"] // 读 fmt.Println(code) code = cMap["广州"] // 读不存在 key fmt.Println(code) code, ok = cMap["广州"] // 检查 key 是否存在 if ok { fmt.Println(code) } else { fmt.Println("key not exist") } delete(cMap, "北京") // 删除 key fmt.Println("北京")
cMap := map[string]int{"北京": 1, "上海": 2, "广州": 3, "深圳": 4} for city, code := range cMap { fmt.Printf("%s:%d", city, code) fmt.Println() }
cMap := make(map[string]int) var wg sync.WaitGroup wg.Add(2) go func() { cMap["北京"] = 1 wg.Done() }() go func() { cMap["上海"] = 2 wg.Done() }() wg.Wait()
在 Go 1.6 之后的版本,多次运行此段代码,你将遇到这样的错误信息:
fatal error: concurrent map writes goroutine x [running]: runtime.throw(0x10c64b6, 0x15) .....
解决之道:
sync.map
provinces := make(map[string]map[string]int) provinces["北京"] = map[string]int{ "东城区": 1, "西城区": 2, "朝阳区": 3, "海淀区": 4, } fmt.Println(provinces["北京"])
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8