ホームページ > バックエンド開発 > Golang > Go のポインター レシーバーは関数内の構造体の変更にどのような影響を与えますか?

Go のポインター レシーバーは関数内の構造体の変更にどのような影響を与えますか?

Barbara Streisand
リリース: 2024-12-23 13:10:21
オリジナル
467 人が閲覧しました

How Do Pointer Receivers in Go Impact Struct Modification Within Functions?

構造体フィールド値の変更

Go では、関数が構造体を受け取ると、通常、元のオブジェクトのコピーを受け取ります。したがって、その関数内で構造体に加えられた変更は、元のオブジェクトには影響しません。

次の例を考えてみましょう。ここでは、2 つのフィールド x と dx を持つ構造体 Point を定義します。 Move メソッドは x を dx ずつインクリメントし、Print メソッドは x の値を出力します。

type Point struct {
  x, dx int
}

func (s Point) Move() {
  s.x += s.dx
  log.Printf("New X=%d", s.x)
}

func (s Point) Print() {
  log.Printf("Final X=%d", s.x)
}

func main() {
  st := Point{ 3, 2 };
  st.Move()
  st.Print()
}
ログイン後にコピー

このコードでは、Move メソッドと Print メソッドが値レシーバーとして Point 構造体に接続されています。これは、st がこれらのメソッドに渡されると、元の st オブジェクトのコピーが作成されることを意味します。これらのメソッド内でコピーに加えられた変更は、元の st オブジェクトには影響しません。

その結果、st.Move() を呼び出すと、st のコピーは変更されますが、元の st オブジェクトは変更されません。 。したがって、st.Print() で st を出力すると、x の元の値が表示されます。

これに対処するには、値レシーバーの代わりにポインター レシーバーを使用するように Move メソッドと Print メソッドを変更する必要があります。これにより、これらのメソッド内の構造に加えられた変更が元のオブジェクトに影響を与えることが保証されます。

type Point struct {
  x, dx int
}

func (s *Point) Move() {
  s.x += s.dx
  log.Printf("New X=%d", s.x)
}

func (s *Point) Print() {
  log.Printf("Final X=%d", s.x)
}

func main() {
  st := Point{ 3, 2 };
  st.Move()
  st.Print()
}
ログイン後にコピー

ポインター レシーバーを使用することで、期待される出力が得られます。

2014/07/28 15:49:44 New X=5
2014/07/28 15:49:44 Final X=5
ログイン後にコピー

以上がGo のポインター レシーバーは関数内の構造体の変更にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート