go map中不允许直接修改值值类型的内容


先来看一段代码

func main() {
   data := make(map[string][2]string)
   data["a"] = [2]string{"c", "d"}
   data["a"][0] = "e"
   fmt.Println(data)
}

结果:第四行编译报错Cannot assign to data["a"][0]

如果改成如下,将map的value改成slice,就不会报错

func main() {
   data := make(map[string][]string)
   data["a"] = []string{"c", "d"}
   data["a"][0] = "e"
   fmt.Println(data)
}

原因是:map中的value如果是值类型(数组是值类型,slice是引用类型),则value不允许被修改,除非将整个value修改掉,如下:

func main() {
   data := make(map[string][2]string)
   data["a"] = [2]string{"c", "d"}
   data["a"] = [2]string{"e", "d"}
   fmt.Println(data)
}

同理,再看看下面这段代码

type Person struct {
   Name string 
   Age int
}
func main() {
   data := make(map[string]Person)
   data["a"] = Person{
      Name: "张三",
      Age: 18,
   }
   data["a"].Name="李四"
   fmt.Println(data)
}

结果:第11行代码报Cannot assign to data["a"].Name,跟上面是同样的问题,map的value是Person值类型,是不可以直接被修改的,除非是将整个value修改

data["a"] = Person{
   Name: "李四",
   Age:  18,
}

或者将value变成引用类型*Person

func main() {
   data := make(map[string]*Person)
   data["a"] = &Person{
      Name: "张三",
      Age:  18,
   }
   data["a"].Name = "李四"
   fmt.Println(data)
}

总结

��天的知识点你学会了吗?关注我,一个一个小知识点积累。


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录