为什么范围类型结构中的值无法修改
在 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字段值没有改变。
这是因为带有范围子句的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 的范围。对于每次迭代,索引用于访问切片中的原始元素,并更新元素的值。这种方法确保修改反映在原始的图表记录切片中。
以上是为什么在 Go Range 循环中修改结构体值不会改变原始切片?的详细内容。更多信息请关注PHP中文网其他相关文章!