Go struct 类型的 map 结构体成员不能修改的问题

错误示例
  • 刚刚上手,我们都会习惯性的向下面这样赋值 ,示例如下
package main

import "fmt"

type person struct {
	name string
	age  int
	sex  string
}

func main() {

    //建立结构体map
	s := make(map[int]person)
	//给map赋值 
	s[1] = person{"tony", 20, "man"}
	fmt.Println(s[1])
	//修改map里结构体的成员属性的值
	s[1].name = "tom"
	fmt.Println(s[1].name)
}

  • 但是这样一些就会报 main\main.go:17:12: cannot assign to struct field s[1].name in map 的错误

错误原因
  • x = y 这种赋值的方式,你必须知道 x的地址,然后才能把值 y 赋给 x
  • go 中的 mapvalue 本身是不可寻址的,因为 map 的扩容的时候,可能要做 key/val pair迁移
  • value 本身地址是会改变的
  • 不支持寻址的话又怎么能赋值呢

解决方法
package main

import "fmt"

type person struct {
	name string
	age  int
	sex  string
}

func main() {

	s := make(map[int]*person)

	s[1] = &person{"tony", 20, "man"}
	fmt.Println(s[1])
	s[1].name = "tom"
	fmt.Println(s[1].name)
}
  • 由刚刚得推断我们可以发现,只要知道了被修改值的地址,我们就可以修改它了
  • 所以我们使用指针和引用保证每次赋值都可以找到地址
  • 就可以实现 map 的结构体赋值了

你可能感兴趣的:(go)