首頁 >後端開發 >Golang >為什麼修改 Go 範圍循環中的值不會改變原始數組?

為什麼修改 Go 範圍循環中的值不會改變原始數組?

Susan Sarandon
Susan Sarandon原創
2024-12-18 04:04:09727瀏覽

Why Doesn't Modifying Values in Go's Range Loop Change the Original Array?

範圍引用代替值

在Go 中,range 關鍵字迭代序列(例如數組或切片)並提供訪問每個元素的鍵(索引)和值。但是,出於效能原因,range 關鍵字會對原始值的 副本 進行操作。這表示對 range 傳回的值所做的任何修改都不會反映在原始數組中。

範例

考慮以下程式碼:

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Attempting to modify a value returned by range
    for _, e := range array {
        e.field = "foo"
    }

    // Printing the values after the range loop
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

執行此程式碼將為所有元素列印“000000”,因為應用了第一個範圍循環內對e.field 所做的修改到副本,並且不影響數組中的原始值。

要使用範圍循環修改陣列的值,您需要使用陣列索引而不是range傳回的值。這可以透過在範圍循環中使用 _ 佔位符捕獲索引來實現。

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Using the array index to modify values
    for idx, _ := range array {
        array[idx].field = "foo"
    }

    // Printing the values after the range loop
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

此修改後的程式碼將成功更改陣列中所有元素的欄位值,並為每個元素列印「foo」元素。

以上是為什麼修改 Go 範圍循環中的值不會改變原始數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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