基本操作演示:
func main() {
m := map[string]int {
"a": 1,
"b": 2,
}
m["a"] = 10
m["c"] = 30
if v, ok := m["d"]; ok {
println(v)
}
delete(m, "d")
}
delete(map, key)
map的特点:
1、map集合使用前一定要make
2、map的key-value是无序的
3、key是不可以重复的,如果遇到重复,后一个value会替换前一个value
4、value可以重复
访问不存在的键值,默认返回零值,不会引发错误,但推荐使用ok-idiom模式,毕竟通过零值无法判断键值是否存在,或许存储的value本就是零
因内存访问安全和哈希算法等缘故,字典被设计成“not addressable”,故不能直接修改“value”成员(结构或数组)
程序运行时会对map并发操作进行检测,如果某个任务正在进行对map的写操作,那么其他任务就不能对该map执行并发操作(读,写,删除),否则会导致程序崩溃。可用sync.RWMutex实现同步,避免读写操作同时进行
按照指定顺序遍历map
func main() {
rand.Seed(time.Now().UnixNano()) //初始化随机数种子
var scoreMap = make(map[string]int, 200)
for i := 0; i < 100; i++ {
key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
value := rand.Intn(100) //生成0~99的随机整数
scoreMap[key] = value
}
//取出map中的所有key存入切片keys
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
//对切片进行排序
sort.Strings(keys)
//按照排序后的key遍历map
for _, key := range keys {
fmt.Println(key, scoreMap[key])
}
}