map 的值不可寻址,那如何修改值的属性?
package main

type Person struct {
	Age int
}

func (p *Person) GrowUp() {
	p.Age++
}

func main() {
	m := map[string]Person{
		"iswbm": Person{Age: 20},
	}
	m["iswbm"].Age = 23
	m["iswbm"].GrowUp()
}
PS E:\TEXT\test_go\test> go run .\main.go
# command-line-arguments
.\main.go:15:2: cannot assign to struct field m["iswbm"].Age in map
.\main.go:16:13: cannot call pointer method GrowUp on Person       
PS E:\TEXT\test_go\test> 

原因在于这两行:

m["iswbm"].Age = 23
m["iswbm"].GrowUp()
m["zhangsan"]

也正是这样,当 map 的值是一个普通对象(非指针),是无法直接对其修改的。

针对这种错误,解决方法有两种。

第一种:新建变量,修改后再覆盖

package main

import "fmt"

type Person struct {
	Age int
}

func (p *Person) GrowUp() {
	p.Age++
}

func main() {
	m := map[string]Person{
		"iswbm": Person{Age: 20},
	}
	
	p := m["iswbm"]
	p.Age = 23
	p.GrowUp()
	
	m["iswbm"] = p
	
	fmt.Println(m) // map[iswbm:{24}]
}

第二种:使用指针的方式

package main

import "fmt"

type Person struct {
	Age int
}

func (p *Person) GrowUp() {
	p.Age++
}

func main() {
	m := map[string]*Person{
		"iswbm": &Person{Age: 20},
	}
	m["iswbm"].Age = 23
	m["iswbm"].GrowUp()
	fmt.Printf("%v", m["iswbm"]) // &{24}
}