ホームページ >バックエンド開発 >Golang >ポインタ レシーバを使用した Go のメソッドが非ポインタ値を変更しているように見えるのはなぜですか?

ポインタ レシーバを使用した Go のメソッドが非ポインタ値を変更しているように見えるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 17:26:11321ブラウズ

Why Does Go's Method with a Pointer Receiver Seem to Modify Non-Pointer Values?

ポインター レシーバーを使用したメソッド

Tour of Go の演習 51 では、メソッド レシーバーについて説明します。提供された説明では、頂点へのポインターを操作する Scale メソッドは、頂点値を直接受け取った場合には効果がないと述べています。ただし、非ポインター Vertex を渡すように main 関数を変更することは、この主張と矛盾します。

なぜ不一致があるのでしょうか?

コードが非ポインター値を受け取っているにもかかわらず、Scale変数が正常に変更されました。この動作は、Go の強力な型指定システムに起因している可能性があります。特定のコンテキストで T へのポインターが予期される場合、その要件を満たすことができるのは T へのポインター (*T) だけです。

コンパイラーは、この動作を可能にするために舞台裏の変換を使用します。

「メソッド呼び出し x.m() は、x (の型) のメソッド セットに m が含まれており、引数リストを m のパラメータ リストに割り当てることができる場合に有効です。x がアドレス可能であり、 &x のメソッド セットには m が含まれており、x.m() は (&x).m():"

の短縮形です。本質的に、コンパイラーは、受け取り側の変数が次の値を持っている場合に、非ポインター値へのポインターを渡すようにコードを書き換えます。ポインターレシーバータイプ。これにより、Scale メソッドで元の変数を変更できるようになります。

以上がポインタ レシーバを使用した Go のメソッドが非ポインタ値を変更しているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。