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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,808评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,796评论 1 32
  • 早晨,手机闹钟响起。关了手机后,翻过身来,儿子还在熟睡,呼吸均匀、长长的睫毛根根分明。看着九分似我的小脸蛋,忍不住...
    清泠韵阅读 3,043评论 1 4
  • 我本以为 我们会一直这样并肩前行 若即若离 但不离不弃 殊不知 一转身 再无然后 也再无其他 ...
    粒譿阅读 773评论 0 0
  • 小毛猴/文
    小毛猴阅读 2,865评论 0 0