Golang

什么是Go的对象方法?Go method

2019-01-25  本文已影响14人  一直安静bg

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。_

上一篇 下一篇

猜你喜欢

热点阅读