代码在这里: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的一个重要特性
添加回答
举报
0/150
提交
取消