字典
创建
Map创建了没有赋值,编译器会报错
1
2
3
4
5
6
7
8
9
10
11
//1.make函数创建 (推荐)
var map2 = make(map[string]string) //make创建会直接初始化,值为nil
//2.创建同时初始化 (有确定的键值时推荐)
var map3 = map[string]int{"Go":100,"java":90} // 有这些键值时使用
//3.var常量定义 (不推荐)
var map1 map[int]string //创建但未初始化,集合为nil
fmt.Println(map1 == nil) //true
fmt.Println(map2 == nil) //false
优化点: 使用 map[string]struct{} 代替 map[string]bool 可以减少内存占用
1
2
remainPlatGoodsIds["id1"] = struct{}{}
remainPlatGoodsIds["id2"] = struct{}{}
ok-idiom
使用 value, ok := map[key] 的语法保证百分之百安全
1
2
3
4
//通过ok-idiom来判断key value是否存在,并获取map
if value, ok := map1[1]; ok {
fmt.Println("map key存在,其值为:", value)
}
示例
1
2
3
4
5
6
7
8
9
10
11
const (
PigeonUserMessageSync = "19003"
)
var MessageStatusMap = map[string]struct{}{
PigeonUserMessageSync: struct{}{},
}
// 判断
if _, ok := message.MessageStatusMap[tag]; ok {
//tag="19003"
}
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func getSendChannel(action *model.ActionInfo) sendChannel {
if action == nil {
return sendChannelMqtt
}
// 百分之百安全
if channelVal, ok := action.ExtraData["channel"]; ok {
ch := sendChannel(channelVal)
switch ch {
case sendChannelPulsar, sendChannelMqtt:
return ch
}
}
return sendChannelMqtt
}
遍历
1
2
3
4
5
6
7
8
9
10
11
12
// 只遍历 key
for key := range paramMap {
fmt.Println(key, paramMap[key])
}
// 遍历key,value
for key, value := range paramMap {
fmt.Println(key, value)
}
// 只遍历value
for _, value := range paramMap {
fmt.Println(value)
}
异常情况
map 读不存在的 key,不报错,返回 value 类型的零值;要判断 key 是否存在,用 v, ok := m[key]
1
2
3
4
5
6
读 map 不会 panic,nil map 读也不会 panic。会读出
写 nil map 会 panic。
只判断值:m[k] == "xxx"
判断key存在:_, ok := m[k]
判断存在且值匹配:v, ok := m[k]; ok && v == "xxx"
GetExtraData() 在 x == nil 时返回 nil,但对 Go 的 nil map 读取是安全的——nilMap[“key”] 返回零值(空字符串)