Map注意点

102 阅读1分钟

基本操作演示:

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])
    }
}