Memahami Fenomena Julat Slice dalam Go
Dalam Go, gelagat julat hirisan boleh mengelirukan. Apabila melelaran ke atas kepingan menggunakan klausa julat, tergoda untuk mempercayai bahawa pembolehubah lelaran memegang alamat setiap elemen. Walau bagaimanapun, ini tidak selalu berlaku. Satu senario sedemikian ialah apabila bekerja dengan struct dan peta.
Pertimbangkan kod berikut:
type student struct { Name string Age int } func main() { m := make(map[string]*student) s := []student{ {Name: "Allen", Age: 24}, {Name: "Tom", Age: 23}, } for _, stu := range s { m[stu.Name] = &stu } }
Kod ini berulang pada sekeping struct, menambah pasangan nilai kunci pada peta untuk setiap struct, dan menyimpan alamat struct sebagai nilai. Walau bagaimanapun, peta yang terhasil menunjukkan bahawa semua nilai menghala ke alamat yang sama.
Untuk menerangkan fenomena ini, kita perlu melihat pelaksanaan asas julat kepingan. Apabila kepingan diulang menggunakan klausa julat, pembolehubah lelaran menerima salinan elemen daripada kepingan. Oleh itu, pembolehubah lelaran memegang salinan struct, bukan alamatnya.
Untuk membetulkan isu ini dan menyimpan alamat struct dalam peta, kod mesti diubah suai untuk mengambil alamat elemen hirisan :
for i := range s { m[s[i].Name] = &s[i] }
Perubahan ini memastikan pembolehubah lelaran memegang alamat struct, dan peta akan menyimpan alamat setiap struct dengan betul dalam hiris.
Atas ialah kandungan terperinci Mengapa Lelaran Julat Slice dalam Pergi Kadangkala Mengembalikan Salinan Daripada Alamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!