跳到主要内容

方法表达式与方法值

方法表达式是什么? receiver 如何传递?​

  • 示例类型: 下文示例基于 type User struct { Name string } 与值为接收者的 func (u User) Greet() string,因此 User.Greet 的类型为 func(User) string;

  • method expression: 从类型选择方法并得到函数值;

  • receiver: 转换为所得函数的第一个参数;

func main() {
fn := User.Greet // receiver 变成第一个参数
println(fn(User{Name: "Tom"}))
}

方法值是什么? receiver 如何绑定?​

  • method value: 从具体值选择方法并得到函数值;
  • receiver: 创建方法值时已绑定;
func main() {
u := User{Name: "Tom"}
fn := u.Greet // receiver 已绑定到函数值
println(fn())
}
  • 保存内容: 创建方法值时会求值并保存接收者;值接收者保存副本,指针接收者保存指针,之后调用不再额外传接收者;
u := User{Name: "Tom"}
greet := u.Greet // Greet 使用值接收者,保存此刻的 User 副本
u.Name = "Jerry"
println(greet()) // hello Tom
println(u.Greet()) // hello Jerry

如何根据接收者的绑定时机选择写法?​

  • 选择入口: 需要调用时再传接收者,使用本篇的方法表达式;需要预先绑定某个对象并交出回调,使用本篇的方法值;