使用陣列索引取代範圍值進行元素修改
在Go 程式設計中,range 關鍵字會迭代集合並傳回鍵以及每個元素的值的副本。此行為可能會阻礙循環內的值修改。以下範例示範了此問題:
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType // Attempt to modify field using range values: for _, e := range array { e.field = "foo" } // Verify that field hasn't been modified: for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
在此程式碼中,我們嘗試使用範圍循環修改陣列中每個元素的欄位。但是,由於範圍傳回值的副本,因此數組中的實際元素保持不變。這會導致所有欄位值保持為空。
解決方案:使用陣列索引
要解決此問題並修改實際元素,您應該使用陣列索引而不是range 循環傳回的值。修改後的程式碼如下:
import "fmt" type MyType struct { field string } func main() { var array [10]MyType // Modify field using array indices: for idx, _ := range array { array[idx].field = "foo" } // Verify that field has been modified: for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
透過使用每個元素的索引而不是值,我們可以直接存取和修改陣列中的實際元素。這可確保欄位值正確更新。
以上是為什麼使用Go的Range關鍵字修改數組元素失敗,數組索引如何提供解決方案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!