go中对象方法一般指为新类型或者,结构体定义的函数。
func (T type)MenthoName(params type) type
对象方法的调用其实相当于普通函数调用的语法糖,类似于下面的
func MenthoName(T type)
也就是把type类型的实例T作为参数,传递给了函数MenthoName。这时参数T称为receiver。
(this type)Mehods()
通过实例t调用Value时,以及通过指针p调用Value时,receiver是t和*p,即复制的是m实例本身,返回的都是m实例的副本。因此receiver是t实例的副本,他们地址不同。
(this *type)Methods()
通过实例t调用Pointer时,以及通过指针p调用Pointer时,复制的是都是&m和p,即复制的都是指向m的指针,返回的都是m实例的地址
上面那段话可能比较难以理解。因此我写了两段代码来做实验
type example struct {
name string
age int
}
func (this example)Value(){
fmt.Println(this)
fmt.Println(&this)
fmt.Printf("this的存放内存地址=%p\n",&this)
}
func main() {
a := example{"liusab",12}
p := &a
a.Value()
//-----------
p.Value()
}
打印出来的结果如下
{liusab 12}
&{liusab 12}
this的存放内存地址=0xc00008e020
{liusab 12}
&{liusab 12}
this的存放内存地址=0xc00008e080
type example struct {
name string
age int
}
func (this *example)Value(){
fmt.Println(this)
fmt.Printf("this的存放内存地址=%p\n",this)
}
func main() {
a := example{"liusab",12}
p := &a
a.Value()
p.Value()
}
上面的这段代码和之前的主要区别是。Value方法传入的是实例的指针,结果如下
&{liusab 12}
this的存放内存地址=0xc00000a080
&{liusab 12}
this的存放内存地址=0xc00000a080
_ 如果想在方法中修改对象的值只能用pointer receiver,对象较大时避免拷贝也要用pointer receiver。_