#Go
map的注意事项
我在使用Map的时候遇到过好多问题,我自己总结下来主要是四块内容。第一是Map的Value可以是任意类型,但是Key必须是可比较的类型。因为Map底层出现哈希冲突的时候还是需要用Key来做一次判断,所以就必须是可以判等的类型。如果用不能判等的切片、Map和函数类型的话,编辑器会直接报错的。第二的话,主要是遍历上。Map的遍历时无序的,我们按照顺序写入1,2,3但是读取的时候不一定会按照123打印,这个是因为Go在遍历哈希桶的时候是随机取一个开始遍历的。所以,最好不要用Map存一些需要排序的内容。第三的话,主要是读取还有删除上,Map读取数据的时候,返回一个Value和一个Ok,Value好理解,Ok的话,是告诉我们这个值存在不存在,有些时候会用下划线吃掉这个ok,这不是个好习惯。因为没法判断原值就是0 还是说这个Key不存在。在删除一个Key 的时候也是,不能直接置空,应该用DELETE函数删除。最后的话,是并发问题。Map是不支持并发的,如果使用多个协程同时操作Map,有可能出现并发错误,爆出fatal error。这个错误和Panic还不一样,它不会被回收,会直接导致服务退出。所以一般不要并发读写Map,真要用可以加锁,或者使用Sync.Map。