首頁 >後端開發 >Golang >為什麼在 Go Range 迴圈中修改結構體值不會改變原始切片?

為什麼在 Go Range 迴圈中修改結構體值不會改變原始切片?

Barbara Streisand
Barbara Streisand原創
2024-12-20 19:05:11315瀏覽

Why Doesn't Modifying Struct Values in a Go Range Loop Change the Original Slice?

為什麼範圍類型結構中的值無法修改

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn