構造体の値を更新する
構造体を扱う場合、値の更新で問題が発生する可能性があります。次のコードを考えてみましょう。
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" } }
このループの実行後、ループ内で見かけの更新があるにもかかわらず、元の ftr 構造体は変更されません。何が問題なのでしょうか?
問題: ポインターと構造体のアンラップ
Go では、値によって構造体を関数に渡すと、構造体のコピーが作成されます。参照渡し。元の構造体へのポインタを提供します。この場合、range を使用して ftr.Mod を反復処理すると、Mod 要素のコピーが作成されます。つまり、ループ内で行われた変更は元の ftr 構造体には反映されません。
解決策: インデックスとポインターの使用
元の ftr 構造体を変更するには、次の手順に従います。
変更されたコードは次のとおりです:
type FTR struct { Id string Mod []*Mod // Use pointers for 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 構造体の値を変更します。
以上がループ内の Go 構造体の値を更新しても元の構造体が変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。