構造体のセッターの動作を理解する
この記事では、Go で構造体型のセッター関数を使用するときに遭遇する一般的な誤解に対処します。 setter 関数を使用しても、構造体の値は変更されませんが、ポインター setter 関数は構造体を正常に変更します。
ポインターを使用しないセッター
構造体が値によって渡される場合関数に追加すると、構造体のコピーが関数内に作成されます。その結果、関数内でコピーされた構造体に加えられた変更は、関数の外にある元の構造体には反映されません。この動作は、次のコードで示されています。
type T struct { Val string } func (t T) SetVal(s string) { t.Val = s }
この例では、SetVal 関数は、ポインター レシーバーのない T のメソッドとして定義されています。構造体 v で SetVal を呼び出すと、関数内で v のコピーが作成され、コピーに加えられた変更は元の構造体 v には影響しません。これは、値を値渡しすると完全に新しいオブジェクトが作成されるためです。
ポインターを持つセッター
逆に、ポインター レシーバーを使用して構造体が参照によって渡されると、関数はポインターを受け取ります。元の構造体に追加することで、関数の外側で実際の構造体を変更できるようになります。この動作は、次のコードで示されています。
func (t *T) SetVal2(s string) { (*t).Val = s }
この例では、SetVal2 はポインター レシーバーを持つ T のメソッドとして定義されています。構造体ポインターで SetVal2 を呼び出すと、関数は元の構造体へのポインターを受け取り、関数内で構造体に加えられた変更は関数の外にある元の構造体に影響します。これは、ポインタの参照渡しが同じオブジェクトのアドレスを共有するためです。
結論
構造体を値で渡すことと、構造体ポインタを構造体ポインタを構造体として渡すことの違いGo の構造体のセッター関数の動作を理解する場合、引数は非常に重要です。違いを認識することで、意図したとおりにセッター関数を使用して構造体を効果的に変更できます。
以上が一部の Go 構造体セッターが元の構造体の変更に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。