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

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

DDD
リリース: 2024-12-18 15:04:11
オリジナル
840 人が閲覧しました

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

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