ホームページ > バックエンド開発 > Golang > 構造体の更新が Go ループ内に保持されないのはなぜですか?

構造体の更新が Go ループ内に保持されないのはなぜですか?

DDD
リリース: 2024-11-15 11:33:02
オリジナル
588 人が閲覧しました

Why Aren't My Struct Updates Persistent in a Go Loop?

構造体の値の更新が機能しない

ループの反復中に構造体内の要素を操作したにもかかわらず、ループの終了時に更新が保持されません。この動作の背後にある理由を理解することは、構造体を正しく操作するために重要です。

問題

構造体スライスを反復処理する場合、ループ変数は要素自体ではなく、元の要素のコピーを参照します。 。したがって、ループ内で行われた変更はコピーにのみ影響し、スライス内の実際の要素には影響しません。

解決策

構造体要素を正常に更新するには、次のアプローチを使用できます。

  • スライスの代わりにインデックスを反復処理します: インデックスを反復処理することで、直接アクセスします実際の構造体要素を取得します。これにより、ループを超えて変更を継続できるようになります。
  • ポインターを避ける: 値を更新する場合、スライスまたは要素へのポインターは不要です。スライスには直接アクセスでき、ポインターを必要とせずに要素を更新できます。

解決策に従う更新されたコード スニペットは次のとおりです。

type FTR struct {
    Id       string
    Mod      []Mod
}

type Mod struct {
    Name       string
    Type       string
}

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"
    }
}
ログイン後にコピー

これを採用することで、このアプローチを使用すると、構造体要素は正常に更新され、変更はループ終了後も保持されます。

以上が構造体の更新が Go ループ内に保持されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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