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を持っていますが、これも私を混乱させます。逆の型推論はありますか?
何か不足していますか、それとも私の論理が間違っていますか?
ありがとう!