为了账号安全,请及时绑定邮箱和手机立即绑定

Go method 指向receiver,指针或是本身怎么样效果一样?

Go method 指向receiver,指针或是本身怎么样效果一样?

慕桂英3389331 2019-04-08 11:19:15
代码在这里:http://play.golang.org/p/koMmlbmwYk代码:packagemainimport"fmt"typeHumanstruct{namestringageintphonestring}typeStudentstruct{Human//匿名字段schoolstring}typeEmployeestruct{Human//匿名字段companystring}//Human定义methodfunc(h*Human)SayHi(){fmt.Printf("Hi,Iam%syoucancallmeon%s\n",h.name,h.phone)}//Employee的method重写Human的methodfunc(e*Employee)SayHi(){fmt.Printf("Hi,Iam%s,Iworkat%s.Callmeon%s\n",e.name,e.company,e.phone)//Yesyoucansplitinto2lineshere.}funcmain(){mark:=Student{Human{"Mark",25,"222-222-YYYY"},"MIT"}sam:=Employee{Human{"Sam",45,"111-888-XXXX"},"GolangInc"}mark.SayHi()sam.SayHi()}对于这句://Human定义methodfunc(h*Human)SayHi(){fmt.Printf("Hi,Iam%syoucancallmeon%s\n",h.name,h.phone)}//Employee的method重写Human的methodfunc(e*Employee)SayHi(){fmt.Printf("Hi,Iam%s,Iworkat%s.Callmeon%s\n",e.name,e.company,e.phone)//Yesyoucansplitinto2lineshere.}receiver是指向Houman的指针,但如果我改成这样://Human定义methodfunc(hHuman)SayHi(){fmt.Printf("Hi,Iam%syoucancallmeon%s\n",h.name,h.phone)}//Employee的method重写Human的methodfunc(eEmployee)SayHi(){fmt.Printf("Hi,Iam%s,Iworkat%s.Callmeon%s\n",e.name,e.company,e.phone)//Yesyoucansplitinto2lineshere.}针向本身,结果输出效果是一样的。这是怎么回事呢?
查看完整描述

2 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

不是这样理解的
首先要区分好函数和方法
方法定义:有接受者的函数叫做方法
至于使用函数还是方法完全是由程序员自己决定的,但是如果想要满足接口(interface{})就只能使用方法,如果没有这方面的需求,那你就使用函数吧
go本身就有这个隐式转换特性,如:
如果t可以获取地址,并且&t的方法中包含d,那么t.d()是(&t).d()的更短写法
工作原理:go首先会查找T类型的变量t的方法列表(看有没有d方法),如果没有找到就会再查找*T类型的方法列表,如果有,会自动转化为(&t).d(),这也是go的一个重要特性
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 348 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信