类型方法

Go的类型方法是带有特殊参数的函数。在一个声明为普通函数的方法函数名前面,增加一个特定参数,该特定参数将函数与该参数的类型进行关联,该特定参数被称为方法的接收器

下面的Go代码是在https://golang.org/src/os/file_plan9.go中的Close()函数的实现:

  1. func (f *File) Close() error {
  2. if err := f.checkValid("close"); err != nil {
  3. return err
  4. }
  5. return f.file.close()
  6. }

Close()函数就是类型方法,因为函数名称前面和func关键字后面有(f *File)参数。f参数被称为方法的接收器;在面向对象编程术语中,这个过程可以描述为向对象发送消息。在Go语言中,方法的接收器是使用常规变量名定义的,通常使用单个字母,而不需要使用专用关键字,如thisself

接下来我们使用methods.go文件的Go代码来呈现一个完整的示例,包含以下四部分。

  1. > ```go
  2. > package main
  3. >
  4. > import (
  5. > "fmt"
  6. > )
  7. >
  8. > type twoInts struct {
  9. > X int64
  10. > Y int64
  11. > }
  12. >

在前面的代码中,定义了结构体twoInts,该结构体包含两个int64类型的字段。

  1. > ```go
  2. > func regularFunction(a, b twoInts) twoInts {
  3. > temp := twoInts{X: a.X + b.X, Y: a.Y + b.Y}
  4. > return temp
  5. > }
  6. >

在本部分中,定义了一个名为regularFunction()的函数,该函数接收两个twoInts类型的参数,并返回一个twoInts类型的值。

  1. > ```go
  2. > func (a twoInts) method(b twoInts) twoInts {
  3. > temp := twoInts{X: a.X + b.X, Y: a.Y + b.Y}
  4. > return temp
  5. > }
  6. >
  1. > _这里真正有趣的是,**类型方法**```method()```与普通函数```regularFunction()```的实现完全相同。_
  2. ```methods.go```的最后一个代码段如下:
  3. > ```go
  4. > func main() {
  5. > i := twoInts{X: 1, Y: 2}
  6. > j := twoInts{X: -5, Y: -2}
  7. > fmt.Println(regularFunction(i, j))
  8. > fmt.Println(i.method(j))
  9. > }
  10. >

如您所见,您调用类型方法i.method(j))的方式是与普通函数(regularFunction(i,j))的调用方式不同。

执行methods.go的输出如下:

  1. $ go run methods.go
  2. {-4 0}
  3. {-4 0}

值得注意的是,类型方法也与接口相关,下一节中将对接口进行讲解,稍后也将看到更多类型方法的使用。