map是无序,非线程安全的,若想使用线程安全的map,使用sync.Map
一、map使用
1. 初始化
直接初始化
var m = map[int]int{}
m[1] = 1
fmt.Println(m[1])
使用make初始化(常用)
m := make(map[int]int)
m[1] = 1
fmt.Println(m[1])
2.判断key是否存在
ok为false时,代表key不存在
m := make(map[int]int)
m[1] = 1
value, ok := m[1]
if !ok {
fmt.Println("key不存在")
} else {
fmt.Println(value)
}
3.遍历map
遍历map时,可以同时得到key和value
m := make(map[int]string)
m[1] = "A"
m[2] = "B"
//结果为:
//key: 1, value: A
//key: 2, value: B
for k, v := range m {
fmt.Println(fmt.Sprintf("key: %d, value: %s", k, v))
}
二、map key
map key的选择:只要能比较就可以。除了常见的int、string,还可以是自定义结构体。
map key不能是 slice,map,function,结构体包含这些元素也不可以,会提示
Invalid map key type: comparison operators == and != must be fully defined for the key type
三、map原理
map源代码: src/runtime/map.go
原理可以看这一篇