1.结构体内容
1.1.结构体的指针方法
如下,定义了一个Person(人)的结构体,包含Name(名字)、Gender(性别)、Age(年龄)、Address(地址)共4个字段;
type Person struct {
Name string
Gender string
Age uint8
Address string
}
func (person *Person) Grow() {
person.Age++
}
func (person *Person) Move(newAddress string) string {
old := person.Address
person.Address = newAddress
return old
1.2.结构体值方法
如下,定义了一个Person(人)的结构体,包含Name(名字)、Gender(性别)、Age(年龄)、Address(地址)共4个字段;
type Person struct {
Name string
Gender string
Age uint8
Address string
}
func (person Person) Grow() {
person.Age++
}
2.分析指针方法和值的方法
p := Person{"Robert", "Male", 33, "Beijing"}
p.Grow()
fmt.Printf("%v\n", p)
1.如果是上述1.1结构体指针方法,打印34;
2.如果是上述1.2结构体值方法,打印33;
为什么?
对于值类型方法来说,接受的标识符是值的一个拷贝的副本,不是值本身。执行Grow方法的person.Age++语句,会使副本的Age值变为34,但是打印的p的Age还是33(因为他们两个并不是一个实例,另一个只是个副本)。
当我们把Grow方法变成指针方法后,打印的值就变成34了,因为此时传递的值是指针的副本,指针的副本任然指向p的值。所以累加操作会作用到person.Age上。
参考:
golang结构体和指针
https://blog.youkuaiyun.com/xiangxianghehe/article/details/78387722
golang 的指针和非指针方法的见解
https://blog.youkuaiyun.com/qq_21816375/article/details/78161723