Go の範囲変数について
Q: 型構造の範囲内の値を変更できないのはなぜですか?
Go では、スライスと範囲の概念が初心者にとって混乱を招く可能性があります。 range ステートメントはコレクション内の要素を反復処理し、要素を反復変数に割り当てます。ただし、構造体の場合、これらの変数を変更しても元の値は変更されません。
A: 反復変数の割り当て
Go プログラミング言語仕様には、次のように記載されています。 range 句を含むステートメントでは、反復変数にはコレクション内の各要素の値が割り当てられます。ただし、これらの変数はループ本体に対してのみローカルです。
反復変数の変更
ループ内で反復変数を変更する場合、実際には元の変数を変更するわけではありません。コレクション内の価値。代わりに、値の新しいコピーを作成し、それを反復変数に割り当てます。
解決策: 変更された値を割り当てる
コレクション内の元の値を変更するには場合は、変更した反復変数を元のコレクションに割り当てる必要があります。コード例では、elem.Count の変更された反復変数を chartRecords[i] に割り当てる必要があります。
更新されたコード
次の更新されたコードです。必要な変更:
for i, elem := range chartRecords { elem.Count = modMe(mod, i) chartRecords[i] = elem fmt.Printf("No: %2d | Count: %2d | Name = %s\r\n", i, elem.Count, elem.Name) }
この変更により、変更された elem.Count 値が適切に割り当てられます。 chartRecords スライス。
以上がGo Range ループ内で構造体の値を直接変更できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。