為什麼範圍類型結構中的值無法修改
在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中文網其他相關文章!