Go的类型方法是带有特殊参数的函数。在一个声明为普通函数的方法函数名前面,增加一个特定参数,该特定参数将函数与该参数的类型进行关联,该特定参数被称为方法的接收器。
下面的Go代码是在https://golang.org/src/os/file_plan9.go中的Close()
函数的实现:
func (f *File) Close() error { if err := f.checkValid("close"); err != nil { return err } return f.file.close() }
Close()
函数就是类型方法,因为函数名称前面和func
关键字后面有(f *File)
参数。f
参数被称为方法的接收器;在面向对象编程术语中,这个过程可以描述为向对象发送消息。在Go语言中,方法的接收器是使用常规变量名定义的,通常使用单个字母,而不需要使用专用关键字,如this
或self
。
接下来我们使用methods.go
文件的Go代码来呈现一个完整的示例,包含以下四部分。
methods.go
的第一部分是以下Go代码:
package main import ( "fmt" ) type twoInts struct { X int64 Y int64 }
在前面的代码中,定义了结构体twoInts
,该结构体包含两个int64
类型的字段。
methods.go
的第二个代码段如下:
func regularFunction(a, b twoInts) twoInts { temp := twoInts{X: a.X + b.X, Y: a.Y + b.Y} return temp }
在本部分中,定义了一个名为regularFunction()
的函数,该函数接收两个twoInts
类型的参数,并返回一个twoInts
类型的值。
methods.go
程序的第三部分包含以下Go代码:
func (a twoInts) method(b twoInts) twoInts { temp := twoInts{X: a.X + b.X, Y: a.Y + b.Y} return temp }
method()
函数等效于methods.go
前面部分定义的regularFunction()
函数。method()
函数是一个类型方法。接下来将介绍类型方法的调用与普通函数调用的差别。
这里真正有趣的是,类型方法
method()
与普通函数regularFunction()
的实现完全相同。
methods.go
的最后一个代码段如下:
func main() { i := twoInts{X: 1, Y: 2} j := twoInts{X: -5, Y: -2} fmt.Println(regularFunction(i, j)) fmt.Println(i.method(j)) }
如您所见,您调用类型方法(i.method(j)
)的方式是与普通函数(regularFunction(i,j)
)的调用方式不同。
执行methods.go
的输出如下:
$ go run methods.go {-4 0} {-4 0}
值得注意的是,类型方法也与接口相关,下一节中将对接口进行讲解,稍后也将看到更多类型方法的使用。