3

Go仕様は次のように述べています。

他の型 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を持っていますが、これも私を混乱させます。逆の型推論はありますか?

何か不足していますか、それとも私の論理が間違っていますか?

ありがとう!

4

1 に答える 1