map的优缺点,以及改进?

参考解析

题目来源:微步

答案:

1.map类似其他语言中的哈希表或字典,以key-value形式存储数据

2.key必须是支持==或!=比较运算的类型,不可以是函数、map或slice

3.map通过key查找value比线性搜索快很多。

4.map使用make()创建,支持:=这种简写方式

5.超出容量时会自动扩容,

6.当键值对不存在时自动添加,使用delete()删除某键值对

缺点:

并发中的map不是安全的

  1. //运行下边代码会报错,原因是并发的去读写map结构的数据了
  2. func main(){
  3. test := map[int]int{1:1}
  4. go func(){
  5. i:=0
  6. for i<10000{
  7. test[i] =1
  8. i++
  9. }()
  10. go func(){
  11. i :=0
  12. for i<10000{
  13. test[i] = 1
  14. i++
  15. }
  16. }()
  17. time.Sleep(2*time.Second)
  18. fmt.Println(test)
  19. }
  20. }
  21. //解决的方法是加锁
  22. func main(){
  23. test := map[int]int{1:1}
  24. var s sync.RWMutex
  25. go func(){
  26. i:=0
  27. for i<10000{
  28. s.Lock()
  29. test[i] =1
  30. s.Unlock()
  31. i++
  32. }()
  33. go func(){
  34. i :=0
  35. for i<10000{
  36. s.Lock()
  37. test[i] = 1
  38. s.Unlock()
  39. i++
  40. }
  41. }()
  42. time.Sleep(2*time.Second)
  43. fmt.Println(test)
  44. }
  45. }
  46. //另一种方法
  47. func main(){
  48. test := sync.Map{}
  49. test.Store(1,1)
  50. go func(){
  51. i:=0
  52. for i<10000{
  53. test.Store(1,1)
  54. i++
  55. }
  56. }()
  57. go func(){
  58. i:=0
  59. for i<10000{
  60. test.Store(1,1)
  61. i++
  62. }
  63. }()
  64. time.Sleep(time.Second)
  65. fmt.Println(test.Load(1))
  66. }