ループ内の Go 構造体の値を更新しても元の構造体が変更されないのはなぜですか?

DDD
リリース: 2024-11-16 15:07:03
オリジナル
270 人が閲覧しました

Why Does Updating Values in a Go Struct Inside a Loop Not Modify the Original Struct?

構造体の値を更新する

構造体を扱う場合、値の更新で問題が発生する可能性があります。次のコードを考えてみましょう。

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 構造体を変更するには、次の手順に従います。

  1. インデックスを使用して反復します: 代わりに、ftr.Mod のインデックスを反復します。要素自体。
  2. ポインターを使用する: 構造体定義の Mod タイプを []*Mod に変更します。
  3. ポインターにアクセスします: 内ループでは、ポインターを使用して Mod 要素の値にアクセスします: *ftr.Mod[index].

変更されたコードは次のとおりです:

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

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