Rumah >pembangunan bahagian belakang >Golang >Mengapa Gelung Go Range Saya Tidak Mengubah Suai Elemen Tatasusunan?
Alamat Pengembalian bukannya Nilai untuk Rujukan Julat
Pertimbangkan situasi di mana pernyataan julat mengembalikan salinan nilai dan bukannya alamat asal . Ini boleh membawa kepada tingkah laku yang tidak dijangka, seperti yang dilihat dalam kod Go berikut:
import "fmt" type MyType struct { field string } func main() { var array [10]MyType for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Dalam contoh ini, tujuannya adalah untuk mengubah suai sifat "medan" setiap elemen dalam tatasusunan. Walau bagaimanapun, oleh kerana pernyataan julat mengembalikan salinan nilai, perubahan dibuat kepada salinan tempatan dan tidak menjejaskan tatasusunan asal. Akibatnya, output menunjukkan semua sifat "medan" sebagai mempunyai nilai lalai.
Untuk menangani isu ini, anda tidak boleh mengembalikan alamat item dalam gelung julat. Sebaliknya, anda harus lelaran melalui tatasusunan menggunakan indeks, seperti yang ditunjukkan di bawah:
func main() { var array [10]MyType for idx, _ := range array { array[idx].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Dengan menggunakan indeks dan bukannya nilai dalam gelung for, anda memastikan bahawa perubahan yang dibuat pada sifat "medan" dicerminkan dalam tatasusunan asal.
Atas ialah kandungan terperinci Mengapa Gelung Go Range Saya Tidak Mengubah Suai Elemen Tatasusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!