構造体セッターの使用: ポインターの重要性を理解する
Go で構造体を操作する場合、セッターを使用すると構造体のプロパティを変更できます。ただし、必要な変更が期待どおりに反映されない場合があります。これは、構造体が関数に渡される方法によるものです。
提供されたサンプル コード:
type T struct { Val string } func (t T) SetVal(s string) { t.Val = s } func (t *T) SetVal2(s string) { (*t).Val = s }
提供された SetVal 関数は、元の構造体を期待どおりに変更しません。構造体は値として関数に渡されます。このコピーに加えられた変更は、元の構造体には影響しません。
あるいは、SetVal2 関数は構造体へのポインターを期待し、元の構造体を変更できます。これは、Go が値によって構造体へのポインタを渡すためです。つまり、関数は元の構造体と同じメモリ位置への参照を受け取ります。
この動作を示すために、次のコードを考えてみましょう。
v := T{"abc"} fmt.Println(v) // {abc} v.SetVal("pdq") fmt.Println(v) // {abc} v.SetVal2("xyz") fmt.Println(v) // {xyz}
この例では、元の構造体 v は SetVal によって変更されませんが、SetVal2 によって変更されます。これは、出力の違いから明らかです。
重要なポイントは、Go で構造体にセッターを使用する場合、値による受け渡しとポインターによる受け渡しの違いを理解することが重要であるということです。ポインターを使用すると、関数で元の構造体を変更できるようになりますが、値渡しでは関数内に構造体のコピーが作成されます。
以上がGo 構造体セッターに元の構造体を変更するためのポインターが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。