Go语言虽然没有类(Class),但同样支持方法(Method),Go语言里的Method其实就是一个带接收者(Receiver)的函数。
一、Method的基本定义
Go语言中的Method类似于一个函数,只是函数名前多了一个绑定类型参数——receiver。
基本格式如下:
func (recv receiver_type) methodName(参数列表)(返回值){
...........
}
Method中的Receiver可以是内置类型、自定义类型、结构体或指针类型。
1、多个Method可以同名
(1)在定义Method时,多个Method可以同名,如果接收者不一样,那么Method就不一样。
(2)如果普通类型作为Receiver,它只是一个值传递;而指针类型作为Receiver,它将是一个引用传递。两者的差别在于,指针作为Receiver 会对实例对象的内容发生操作,而普通类型作为Receiver仅是以副本作为操作对象,并不对原实例对象发生操作
(3)Method里面可以访问接收者的字段,调用Method进行访问,就像在Struct里访问字段一样。
2、匿名Receiver
(1)如果方法代码中从不使用Receiver参数,那么就可以省略Receiver的变量名,此时的接收者将是一个匿名Receiver。
(2)如果定义了两个匿名Receiver,一个是普通类型,另外一个是指针类型。注意,这种情况下方法名不能同名,要不然编译会出错。
二、Method的继承
如果匿名字段实现了一个Method,那么包含这个匿名字段的Struct对象也能调用该Method。
三、Method重写
在上例中,如果student想要实现自己的sayHi()方法,可以采用Method重写的方法来解决。这和匿名字段重名是一样的道理,即外部方法会隐藏匿名字段同名方法。所以可以在student上再定义一个Method,重写了匿名字段的方法。
编译并运行该程序,输出结果为:
Hi,I'm郑智you can call me on 010一22002.
Hi,I'm李明,I study in Yale University,call me on 010- 11001.
通过上例的运行结果可以看出,对象studentl在调用sayHi()方法时,Receiver为people的方法将被隐藏,实际调用的是Receiver为student的这个外部sayHi()方法。