Dalam Go, slice ialah struktur data yang berkuasa yang boleh diulang lebih menggunakan kata kunci julat. Walau bagaimanapun, dalam fenomena pelik, apabila melelaran pada sekeping struct menggunakan julat-untuk, unsur-unsur dalam peta yang terhasil berkongsi alamat yang sama. Tingkah laku ini boleh mengelirukan, terutamanya kerana elemen dalam kepingan asal sepatutnya mempunyai alamat yang unik.
Kunci untuk memahami fenomena ini terletak pada cara pembolehubah berada tersimpan dalam ingatan. Apabila mengakses elemen hirisan dalam gelung julat untuk (stu dalam kes ini), stu pembolehubah tempatan memegang salinan struct. Menetapkan penuding kepada pembolehubah setempat secara berkesan menghalakan semua elemen dalam peta ke salinan struct yang sama dalam ingatan.
Untuk menyelesaikan isu ini dan tetapkan alamat unsur hirisan, kod tersebut mesti diubah suai untuk mengambil alamat unsur hirisan itu sendiri. Dengan menggunakan s[i] dan bukannya stu, penuding kepada elemen sebenar dalam hirisan ditetapkan pada peta.
package main import "fmt" 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 i := range s { m[s[i].Name] = &s[i] // Change here } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } }
Output:
map[Allen:0xc0000a6058 Tom:0xc0000a6060] Allen &{Allen 24} Tom &{Tom 23}
Dengan memahami tingkah laku pengurusan memori yang mendasari, kita boleh menangani bahagian ini fenomena julat dalam Go. Dengan mengambil alamat elemen hirisan itu sendiri, kami memastikan setiap elemen dalam peta menghala ke struct unik dalam ingatan, mengekalkan integriti data.
Atas ialah kandungan terperinci Mengapakah Go Slice Range Loop Mencipta Alamat Dikongsi Apabila Memetakan Struktur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!