Rumah >pembangunan bahagian belakang >Golang >Mengapa Pengubahsuaian Nilai dalam Gelung Julat Go Tidak Mengubah Tatasusunan Asal?
Rujukan Julat Sebaliknya Nilai
Dalam Go, kata kunci julat berulang mengikut jujukan, seperti tatasusunan atau kepingan dan menyediakan akses kepada kedua-dua kunci (indeks) dan nilai setiap elemen. Walau bagaimanapun, atas sebab prestasi, kata kunci julat beroperasi pada salinan nilai asal. Ini bermakna sebarang pengubahsuaian yang dibuat kepada nilai yang dikembalikan mengikut julat tidak akan ditunjukkan dalam tatasusunan asal.
Contoh
Pertimbangkan kod berikut:
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("--") } }
Menjalankan kod ini akan mencetak "000000" untuk semua elemen kerana pengubahsuaian yang dibuat pada e.field dalam gelung julat pertama digunakan kepada salinan dan tidak menjejaskan nilai asal dalam tatasusunan.
Penyelesaian
Untuk mengubah suai nilai tatasusunan menggunakan gelung julat, anda perlu menggunakan indeks tatasusunan bukannya nilai yang dikembalikan mengikut julat. Ini boleh dicapai dengan menangkap indeks menggunakan _ pemegang tempat dalam gelung julat.
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("--") } }
Kod yang diubah suai ini akan berjaya menukar nilai medan untuk semua elemen dalam tatasusunan dan mencetak "foo" untuk setiap elemen.
Atas ialah kandungan terperinci Mengapa Pengubahsuaian Nilai dalam Gelung Julat Go Tidak Mengubah Tatasusunan Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!