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