ホームページ > バックエンド開発 > Golang > Goでネストされた構造体の値を更新するにはどうすればよいですか?

Goでネストされた構造体の値を更新するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-05 14:46:10
オリジナル
224 人が閲覧しました

How to Update Nested Struct Values in Go?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート