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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-23 13:10:21472ブラウズ

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 サイトの他の関連記事を参照してください。

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