先来看一段代码
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)
}
总结
��天的知识点你学会了吗?关注我,一个一个小知识点积累。