ホームページ >バックエンド開発 >Golang >構造体スライス上の Go Range ループ内の値を直接変更できないのはなぜですか?

構造体スライス上の Go Range ループ内の値を直接変更できないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-20 17:21:14218ブラウズ

Why Can't I Directly Modify Values in a Go Range Loop Over a Struct Slice?

型構造の範囲内の値を変更できないのはなぜですか?

このプログラミング クエリは、構造化された型の範囲内の値を変更できないことから生じます。 Go プログラミング言語。この問題を理解するには、Go でスライスと範囲がどのように動作するかを詳しく調べる必要があります。

chartRecords 配列にデータをロードする最初の方法にもかかわらず、ループ内の値を変更しても効果がないようです。出力は、変更された値を反映するのではなく、元の値を保持します。

この混乱は、Go がスライスと範囲を処理する方法に起因しています。 for ステートメント内の range 句の場合、Go は反復値を対応する反復変数に割り当てますが、それらの変更はブロック内でのみ適用されます。これらの反復変数はコピーであり、元のスライス要素への参照ではありません。

スライス要素に永続的な変更を加えるには、反復変数からの変更された値を明示的にスライスに割り当てる必要があります。更新されたコードは次のとおりです。

for i, elem := range chartRecords {
    elem.Count = modMe(mod, i)
    chartRecords[i] = elem
}

この変更されたループでは、反復変数 elem で変更された値が元のスライス chartRecords に割り当てられ、変更が永続的であることが保証されます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。