map取一个key,然后修改这个值,原map数据的值会不会变化,根据map存储的类型回答

题目来源:腾讯音乐

**答案:** map是引用类型的, map取一个key,然后修改这个值,原map数据的值也会变化。

元素value类型为int , string

  1. // 初始化一个int值的map并赋值
  2. m2 := map[string]int{}
  3. m2["A"] = 1
  4. m2["B"] = 2
  5. fmt.Println(m2) // map[A:1 B:2]
  6. m2["A"] = 3
  7. fmt.Println(m2) // map[A:3 B:2]
  8. // 初始化一个string值的map并赋值
  9. m3 := map[string]string{}
  10. m3["a"] = ""
  11. m3["b"] = "b"
  12. fmt.Println(m3) // map[a: b:b]
  13. m3["a"] = "a"
  14. fmt.Println(m3) // map[a:a b:b]

元素value类型为struct

  1. type data struct {
  2. name string
  3. gender string
  4. }
  5. // 初始化一个struct值的map并赋值
  6. m := map[string]data{"x": {"value1", "F"}}
  7. // 当key不存在map中的时候为新增,当key存在于map的时候为修改,覆盖旧值
  8. m["y"] = data{"value2", "M"} // 增加新键值对
  9. m["z"] = data{"value3", "M"} // 增加新键值对
  10. fmt.Println(m) // map[x:{value1 F} y:{value2 M} z:{value3 M}]
  11. //map元素是无法取址的,不可以m["x"].name来直接修改
  12. // 1,修改key为y的值,只修改gender字段
  13. m["y"] = data{gender: "F"} // map[x:{value1} y:{new value}]
  14. // 修改key为z的name,构造新结构体赋值
  15. m["z"] = data{name: "z's name", gender: "F"}
  16. fmt.Println(m) // map[x:{value1 F} y:{ F} z:{z's name F}]
  17. // 2,将map的value设为指针类型(结构体较大时最优)
  18. mm := map[string] *data{}
  19. mm["a"] = &data{gender:"F",name:"name"}
  20. fmt.Println(mm["a"]) // &{name F}
  21. // 修改name字段为name1
  22. mm["a"].name = "name1"
  23. fmt.Println(mm["a"]) // &{name1 F}
  24. // 注意下面一行操作,key为new的元素不存在,此时mm["new"]是空引用,不能.name
  25. mm["new"].name = "new" // panic: runtime error: invalid memory address or nil pointer dereference
  26. // 可以这样来
  27. mm["new"] = &data{name:"new",gender:"new"}
  28. for key, value := range mm {fmt.Printf("m[%s] = %s \t", key, value)} //m[a] = &{name1 F} m[new] = &{new new}
  29. // 3,以第三方变量的方式,如想修改key为x的元素值,原元素为"x": {"value1", "F"},修改F为M
  30. data := m["x"]
  31. data.gender = "M"
  32. m["x"] = data
  33. fmt.Println(m) // map[x:{value1 M} y:{ F} z:{z's name F}]