一尘不染

Go方法集-带有接收者T的指针类型* T的调用方法

go

Go spec说:

其他任何类型T的方法集都包含接收者类型T的所有方法。相应指针类型 T的方法集是接收者 T或T的所有方法的集合(也就是说,它还包含T)。

我的理解是:T有自己的方法集,而 T有自己的方法集加上T的方法集,因为它可以将接收者 T取消引用到T并调用该方法。因此,我们可以使用变量T的接收者*
T调用某些方法。

因此,我决定验证自己的逻辑:

package main

import (
  "fmt"
  "reflect"
)

type User struct{}

func (self *User) SayWat() {
  fmt.Println(self)
  fmt.Println(reflect.TypeOf(self))
  fmt.Println("WAT\n")
}

func main() {
  var user User = User{}

  fmt.Println(reflect.TypeOf(user), "\n")

  user.SayWat()
}

http://play.golang.org/p/xMKuLzUbIf

我有点困惑。看来我可以在T上调用方法“ of * T”?我有一个更广泛的示例http://play.golang.org/p/RROPMj534A,这也使我感到困惑。反之亦然有类型推断吗?

我是否缺少某些东西,或者我的逻辑不正确?

谢谢!


阅读 323

收藏
2020-07-02

共1个答案

一尘不染

您不能调用*Ton 的方法T,但是编译器足够聪明,可以为您获取变量的引用,从而有效地调用

(&user).SayWat()

在这里解释:

调用:如果x的方法集包含m并且参数列表可以分配给m的参数列表,则方法调用xm()有效。如果x是可寻址的并且&x的方法集包含m,则xm()是(&x).m()的简写。

要了解差异,例如,您可以采用一个返回值(不可寻址):

func aUser() User {
    return User{}
}

...

aUser().SayWat()

失败并出现错误:

prog.go:40: cannot call pointer method on aUser()
prog.go:40: cannot take the address of aUser()

http://play.golang.org/p/HOTKiiOK7S

2020-07-02