範圍引用代替值
在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中文網其他相關文章!