ホームページ >バックエンド開発 >Golang >Go で構造体フィールドを正しく変更するにはどうすればよいですか?

Go で構造体フィールドを正しく変更するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-17 17:58:10223ブラウズ

How to Correctly Modify Struct Fields in Go?

Go で構造体フィールドに新しい値を代入する

Go では、関連するデータをカプセル化し、一連のメソッドを提供するために構造体が一般的に使用されます。彼らのフィールドを操作します。ただし、構造体フィールドを操作するときに遭遇する一般的な問題の 1 つは、その値を正しく変更することです。

以下の例では、Point という名前の構造体が 2 つのフィールド x と dx で作成されます。 Move() と Print() の 2 つのメソッドは、それぞれ 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)
}

main() では、新しい Point インスタンスがデフォルト値 x=3 および x=3 で作成されます。 dx=2。 Move() メソッドと Print() メソッドは、Move() 中に x フィールドの値が変更され、Print() 出力に更新された値 (最終 x=5) が反映されることを期待して呼び出されます。ただし、実際の出力は次のとおりです。

2014/07/28 15:49:44 New X=5
2014/07/28 15:49:44 Final X=3

この予期しない動作は、両方のメソッドのレシーバーがポインタ レシーバー (*Point) ではなく値レシーバー (つまり、Point) として定義されているために発生します。 Go では、値レシーバーを持つメソッドに値が渡されると、その値のコピーがメソッド内に作成され、そのコピーのフィールドに加えられた変更は元の値に影響しません。

この問題を解決して元の構造体を変更するには、両方のメソッドでポインター レシーバーを使用する必要があります。これにより、メソッドが元の構造体で直接動作し、メソッド内で加えられた変更が元のインスタンスに反映されることが保証されます。

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)
}

この変更により、Move() メソッドは x フィールドを正しく更新し、 Print()メソッドは更新された値を出力します。

以上がGo で構造体フィールドを正しく変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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