【方法的概念】
在 Go 语言中,结构体就像是类的一种简化形式,那么面向对象程序员可能会问:类的方法在哪里呢?在 Go 中有一个概念,它和方法有着同样的名字,并且大体上意思相同:Go 方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数
【方法的特点】
1- 接收者类型可以是(几乎)任何类型,不仅仅是结构体类型:任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或数组的别名类型。但是接收者不能是一个接口类型,因为接口是一个抽象定义,但是方法却是具体实现;如果这样做会引发一个编译错误。
2- 最后接收者不能是一个指针类型,但是它可以是任何其他允许类型的指针
3- 一个类型加上它的方法等价于面向对象中的一个类
备注:区别是在 Go 中,类型的代码和绑定在它上面的方法的代码可以不放置在一起,它们可以存在在不同的源文件,唯一的要求是:它们必须是同一个包的,这也是为什么不在int、float或者类似的类型定义方法了。
4- 因为方法是函数,所以同样的,不允许方法重载,即对于一个类型只能有一个给定名称的方法。
5- 别名类型不能有它原始类型上已经定义过的方法
【定义方法的格式】
func (recv receiver_type) methodName(parameter_list)(return_value_list){...}
func (_ receiver_type) methodName(parameter_list)(return_value_list){...}
说明:在方法名之前,func关键字之后的括号中指定receiver(接收类型);如果recv是receiver的实例,Method1是它的方法名,那么方法调用遵循传统的object.name选择器符号;如果recv是一个指针,Go会自动解除引用,不需要在手动*recv,直接使用recv.Method1;如果不需要recv的值可以用_代替recv;recv就像面向对象语言中的this或self
【举例】
1 package main 2 3 type TwoInts struct{ 4 a int 5 b int 6 } 7 8 func main(){ 9 two1 := new(TwoInts) 10 two1.a = 10 11 two1.b = 12 12 func11 := two1.addThem() 13 func12 := two1.addToParam(1) 14 15 two2 := TwoInts{3,4} 16 func21 := two2.addThem() 17 func22 := two2.addToParam(1) 18 } 19 20 func(tn *TwoInts)addThem()int{ 21 return tn.a + tn.b 22 } 23 24 func(tn *TwoInts)addToParam(param int)int{ 25 return tn.a + tn.b +param 26 }
【学习参考处:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/directory.md】