map的使用

  • 基础
    • 对key的要求:必须是支持**==**运算符的数据类型,所以map可以通过key的全等进行比较。所以不太建议使用浮点数作为key,比如出现的NaN与任何浮点数都不相等。结构体的比较有点复杂,情况比较多,需谨慎
    • 使用delete(map, key)函数可以删除指定的kv对。访问map中一个不存在的key是安全的(会返回零值),delete也是如此
    • 但是在使用map的使用,绝大多数的操作都是安全的,你可以访问 == nil的map的元素等等。但是你不能进行存放操作
    • 迭代的顺序是不确定的(而且设计者为了避免大家依赖其顺序,会故意打乱顺序并输出),如果想要顺序访问,可以抽取一个[]key,排序,并用这个去访问
    • if value, ok := map[key],就像interface断言一样。请使用ok来判断是否存在kv对
  • 关于value
    • 如果是struct,则无法对其某个具体的字段进行修改。大意是由于可能会rehash、扩容等,不允许寻址的操作。这个部分需要深入了解

一些问题,能不能用struct

底层

扩容

负载因子 = key数量 / bucket数量

  • 渐进式扩容
  • 等量扩容
    • buckets数量不变,主要是将松散的kv进行重排列,以提高效率

      并发

Links