包级别的函数(Package-level Function)

就是普通的、不属于任何类型的函数,定义在包内,通过 包名.函数名 调用:

1
2
3
4
5
6
7
8
9
package geometry                                                                       

// 这就是包级别的函数
func Distance(p, q Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
}

// 调用时需要带包名
geometry.Distance(p, q)

接收器(Receiver)

在函数名前面多加一个参数,这个函数就变成了该类型的方法,这个参数就叫接收器:

1
2
3
4
5
6
7
//   ┌── 接收器 ──┐
func (p Point) Distance(q Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
}

// 调用时是 "对象.方法" 的形式
p.Distance(q)

对比一目了然

1
2
3
4
5
6
7
8
9
10
11
// 包级别函数:两个点都是普通参数
func Distance(p, q Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
}
Distance(p, q) // 调用

// 方法:p 变成了接收器,"拥有"这个方法
func (p Point) Distance(q Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
}
p.Distance(q) // 调用
包级别函数 方法
语法 func 函数名(参数) func (接收器) 方法名(参数)
归属 属于包 属于某个类型
调用 包名.函数名() 对象.方法名()
类比 像 C 的普通函数 像 Java/Python 中类的方法

简单理解:接收器就是告诉 Go “这个函数是谁的方法”,相当于其他语言里的 this/self,只是 Go 把它显式写在了函数签名里。