假设有一个结构体Hero

package main

type Hero struct {
	Name string
	Ad int
	Level int
}

想要修改该结构体对象的属性,有两种方式:

一种是定义一个结构体指针的方法

// 这里如果是func (h Hero) SetName(name string),则无法成功修改hero的Name
func (h *Hero) SetName(name string) {
	h.Name = name
}
hero := Hero{
		Name: "zhang3",
		Ad: 100,
		Level: 1,
	}
hero.SetName("li4")

需要注意的是,SetName方法需要定义为结构体指针的方法,也就是*Hero的方法,不能是Hero的方法,如果定义为Hero的方法,那么每次调用SetName时,方法作用域内的h将会是对象hero的一个副本,而不是我们真正要修改的那个对象,如果定义为*Hero的方法,每次调用时,修改的就是我们调用的那个hero了

另一种是定义一个方法,将对象作为参数传入

func SetName2(h *Hero, name string) {
   h.Name = name
}
hero := Hero{
		Name: "zhang3",
		Ad: 100,
		Level: 1,
	}
SetName2(&hero, "wang5")

同样,这里SetName2定义的参数为Hero对象的指针,调用SetName2时要将对象hero取址后传入,这样才能正确修改hero对象,如果不传入指针,那么修改的就是hero的副本,而hero本身不会有任何改变。


oh yeah