非ポインター型のポインター メソッド: 混乱を解く
ポインター メソッドはポインターに対してのみ呼び出すことができるという概念にもかかわらず、ポインタ以外の値に対して実行することも可能です。この明らかな矛盾には明確な説明が必要です。
レシーバーのルール
この原則では、値メソッドは値とポインターの両方で呼び出すことができるが、ポインター メソッドはポインターに制限されると規定されています。
の場合Point
指定された例では、 car.fourWheels() メソッドにはポインター レシーバーがあります。ただし、式 c.fourWheels() を使用して、車の値に対して呼び出すことができます。
The Truth Unveiled
これが可能なのは、Go の仕様でポインターの呼び出しが許可されているためです。後者がアドレス指定可能な場合は、非ポインター値に対するメソッド。この例では、 car 変数はアドレス指定可能であるため、& 演算子を使用してポインターに変換できます。したがって、式 c.fourWheels() は次の短縮表現と同等です:
(&c).fourWheels()
ルールの明確化
「受信者ルール」は次のように解釈する必要があります。
アドレス指定不可能な式
ただし、すべての式がアドレス指定可能な値になるわけではないことに注意することが重要です。たとえば、関数の戻り値とマップのインデックス式は通常、アドレス指定できない値を生成します。このような場合、それらの式の結果に対してポインタ メソッドを直接呼び出すことはできません。
結論
Go のアドレス可能性ルールにより、ポインタ以外の値に対するポインタ メソッドの呼び出しは可能です。 。これにより、より柔軟な方法でポインター メソッドを利用できるようになりますが、アドレス指定できない式によって課される制限を認識することが重要です。
以上がGo で非ポインター型に対してポインター メソッドを呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。