猿问

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

代码在这里:
http://play.golang.org/p/koMmlbmwYk
代码:
packagemain
import"fmt"
typeHumanstruct{
namestring
ageint
phonestring
}
typeStudentstruct{
Human//匿名字段
schoolstring
}
typeEmployeestruct{
Human//匿名字段
companystring
}
//Human定义method
func(h*Human)SayHi(){
fmt.Printf("Hi,Iam%syoucancallmeon%s\n",h.name,h.phone)
}
//Employee的method重写Human的method
func(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定义method
func(h*Human)SayHi(){
fmt.Printf("Hi,Iam%syoucancallmeon%s\n",h.name,h.phone)
}
//Employee的method重写Human的method
func(e*Employee)SayHi(){
fmt.Printf("Hi,Iam%s,Iworkat%s.Callmeon%s\n",e.name,
e.company,e.phone)//Yesyoucansplitinto2lineshere.
}
receiver是指向Houman的指针,但如果我改成这样:
//Human定义method
func(hHuman)SayHi(){
fmt.Printf("Hi,Iam%syoucancallmeon%s\n",h.name,h.phone)
}
//Employee的method重写Human的method
func(eEmployee)SayHi(){
fmt.Printf("Hi,Iam%s,Iworkat%s.Callmeon%s\n",e.name,
e.company,e.phone)//Yesyoucansplitinto2lineshere.
}
针向本身,结果输出效果是一样的。
这是怎么回事呢?
倚天杖
浏览 369回答 2
2回答

慕斯王

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

相关分类

JavaScript
我要回答