型構造の範囲内の値を変更できない理由
Go では、スライスのような型構造の範囲によって、コピーではなく基礎となるデータのビュー。範囲を反復処理する場合、反復変数に加えられた変更は、元のデータではなく、その特定のビューにのみ影響します。
これを理解するには、次のコード スニペットを考慮してください。
type myStruct struct { Name string Count int } func main() { chartRecords := []myStruct{} for i := 0; i < 4; i++ { n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)} chartRecords = append(chartRecords, n) } for _, elem := range chartRecords { elem.Count = 0 fmt.Println(elem) } fmt.Println(chartRecords) }
これコード スニペットは chartRecords の範囲を反復し、各反復変数の Count フィールドを 0 に変更し、変更された変数を出力します。ただし、元の chartRecords スライスが印刷されると、Count フィールドの値が変更されていないことが示されます。
これは、range 句を含む for ループが範囲内の各要素のコピーを作成するためです。コピーに加えられた変更は、元の要素には影響しません。元の要素を変更するには、スライス内のインデックスにアクセスして、要素を明示的に更新する必要があります。例:
func main() { chartRecords := []myStruct{} for i := 0; i < 4; i++ { n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)} chartRecords = append(chartRecords, n) } for i, elem := range chartRecords { chartRecords[i] = myStruct{Count: 0, Name: elem.Name} } fmt.Println(chartRecords) }
この例では、range 句を含む for ループを使用して chartRecords の範囲を反復処理します。反復ごとに、インデックスを使用してスライス内の元の要素にアクセスし、要素の値が更新されます。このアプローチにより、変更が元の chartRecords スライスに確実に反映されます。
以上がGo Range ループで構造体の値を変更しても元のスライスが変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。