Go での構造体の値の更新
Go では、構造体は値型です。つまり、ある構造体を別の構造体に代入すると、その構造体の値がコピーされるのではなく、その値がコピーされます。リファレンスを作成しています。これにより、ネストされた構造体内の値を変更しようとすると、予期しない動作が発生する可能性があります。
次のコード スニペットを検討してください。
ftr := FTR{} err := yaml.Unmarshal([]byte(yamlFile), &ftr) for index, element := range ftr.Mod { switch element.Type { case "aaa", "bbbb": element.Type = "cccc" case "htr": element.Type = "com" case "no": element.Type = "jnodejs" case "jdb": element.Type = "tomcat" } }
目的は、次の Mod 要素の Type フィールドを更新することです。一連の条件に基づく FTR 構造体。ただし、コードの実行後、各要素の Type フィールドは変更されません。
この動作は、範囲ループが ftr.Mod スライスのコピーを反復処理するという事実によって発生します。その結果、ループ内で要素変数に加えられた変更は、元の ftr.Mod スライスには反映されません。
この問題を解決し、ftr 構造体の値を正しく更新するには、インデックスベースの反復を使用できます。スライス全体にわたる代わりに。これにより、元のスライスの値を直接変更できます。
type FTR struct { Id string Mod []Mod } for index := range ftr.Mod{ switch ftr.Mod[index].Type { case "aaa", "bbbb": ftr.Mod[index].Type = "cccc" case "htr": ftr.Mod[index].Type = "com" case "no": ftr.Mod[index].Type = "jnodejs" case "jdb": ftr.Mod[index].Type = "tomcat" } }
ftr.Mod スライスのインデックスを反復処理し、対応する要素を直接変更することで、元の ftr 構造体が確実に次のように更新されます。
以上がGoでネストされた構造体の値を更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。