1

Golang 言語仕様には次のように記載されています。

その他のタイプ T のメソッド セットは、レシーバ タイプ のすべてのメソッドで構成されますT。対応するポインター型のメソッド セットは、*Tレシーバーが*TorのすべてのメソッドのセットですT(つまり、 のメソッド セットも含まれますT)。

どうしてこれなの?受信するメソッドがT設定されたメソッドに属しているのに、*Tその逆ではないのはなぜですか?

4

1 に答える 1

6

よくある質問から:

インターフェイス値にポインター *T が含まれている場合、メソッド呼び出しはポインターを逆参照することによって値を取得できますが、インターフェイス値に値 T が含まれている場合、メソッド呼び出しがポインターを取得するための有用な方法はありません。

ところで、ポインター レシーバーを持つメソッドは、ポインター パラメーターを変更できるのと同じように、レシーバーを変更できます。非ポインターレシーバーをポインターレシーバーとして渡すと (これが可能であると仮定して)、メソッドはそれを変更できますが、そうすべきではありません。

型のすべてのメソッドに対して 1 つの一貫したレシーバー型を使用し、ポインターとダイレクト レシーバーを混在させないようにすることをお勧めします。また、大きな型にはポインター レシーバーを使用することをお勧めします。

于 2012-05-20T11:02:04.463 に答える