ホームページ >バックエンド開発 >Golang >Go Struct メソッドが元のオブジェクトを変更しないのはなぜですか?

Go Struct メソッドが元のオブジェクトを変更しないのはなぜですか?

DDD
DDDオリジナル
2024-12-18 15:04:11841ブラウズ

Why Does My Go Struct Method Not Modify the Original Object?

Struct フィールドへの新しい値の割り当て

次のシナリオを考えてみましょう。Point クラスは、x を調整する Move() メソッドで定義されています。座標と結果を表示するための Print() メソッド。ただし、コードは予期しない動作を示し、Move() を呼び出した後、調整された値ではなく初期の 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() が値レシーバーとして定義されているという事実に起因します。つまり、元の Point オブジェクトのコピーを操作します。したがって、Move() 内で を変更しても、実際のインスタンスには影響しません。

これを解決するには、Move() メソッドをポインタ レシーバとして定義し、元のオブジェクトと直接対話できるようにする必要があります。

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() が呼び出されると、s 変数は元の Point オブジェクトを指すため、s.x への変更はインスタンスに直接影響します。したがって、Move() の後に Print() を呼び出すと、更新された x 座標が正しく表示されます。

以上がGo Struct メソッドが元のオブジェクトを変更しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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