go 语言——方法变量与方法表达式

面向对象的(OOP)的编程思想已经在工业领域和教学领域占据了主导位置,而且几乎所有广泛应用的编程语言都支持了这种思想。Go 语言也不例外。而我们要介绍的方法就是某个特定类型的函数。
 

函数


package main

import "fmt"

func main() {
   fmt.Println(add(3, 5))
}

func add(a, b int) int {
   return a+b
}
函数包含连续的执行语句,可以在代码中通过调用函数来执行它们。函数能够将一个复杂的工作切分成多个更小的模块,使得的多人协作变得更加容易。另外,函数对使用者隐藏了实现细节。

在此之所以要先介绍函数,主要是先定义一下形参与实参,后面我们要用到这个概念
a 和 b 是函数 add 申明的形参
3 和 5 是调用函数时的实参
 

方法


type Point struct {
   X, Y float64
}

func (p Point) Distance(q Point) float64 {
   return math.Hypot(q.X-p.X, q.Y-p.Y)
}
方法的声明和普通函数的声明类似,只是在函数名字的前面多了一个参数。这个参数把这个方法绑定到这个参数对应的类型上。上面定义了一个 Point 类型的方法 Distance,附加的参数 p 称为方法的接收者。go 语言的方法接收者不实用特殊的名字(this,self)。
 

方法变量


func main() {
   p := Point{1, 2}
   q := Point{4, 6}
   dis := p.Distance
   fmt.Println(dis(q))
}

type Point struct {
   X, Y float64
}

func (p Point) Distance(q Point) float64 {
   return math.Hypot(q.X-p.X, q.Y-p.Y)
}
dis := p.Distance
以上就定义了一个方法变量,如果包内的 API 调用一个函数值,并且使用者期望这个函数的行为是调用一个特定接收者的方法,方法变量非常有用。
 

方法表达式


func main() {
   p := Point{1, 2}
   q := Point{4, 6}

   dis := Point.Distance
   fmt.Println(dis(p, q))
}

type Point struct {
   X, Y float64
}

func (p Point) Distance(q Point) float64 {
   return math.Hypot(q.X-p.X, q.Y-p.Y)
}
dis := Point.Distance
以上就定义了一个方法表达式。方法表达式写成 T.f 或者 (*T).f,其中 T 是类型。方法表达式是一种函数变量,把原来方法的接收者替换成函数的第一个形参,因此它可以想平常的函数一样调用。

dis 就相当于 func dis(x, y Point) float64,第一个形参 x 就是方法的接收者。dis(p, q) 调用的 p 可以理解为方法 Distance 的接收者。
Posted by 何敏 on 2020-02-19 02:39:16