Memahami Gelagat Go Slice Ranges
In Go, slices ialah struktur data asas yang menyediakan storan elemen yang cekap dan dinamik. Apabila bekerja dengan kepingan, adalah penting untuk memahami kelakuan gelung julat.
Pertimbangkan coretan 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 } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } }
Kod mentakrifkan sekeping struct pelajar dan peta. Ia berulang ke atas hirisan menggunakan gelung julat, di mana setiap elemen ditugaskan kepada pembolehubah 'stu.' Walau bagaimanapun, tingkah laku tidak dijangka yang diperhatikan ialah semua entri peta menghala ke alamat yang sama dalam hirisan.
Punca Punca:
Isu ini berpunca daripada tugasan gelung julat kepada pembolehubah 'stu.' Apabila gelung berulang, 'stu' diberikan salinan elemen hirisan pada indeks tersebut. Akibatnya, semua entri peta merujuk kepada nilai yang disalin yang sama.
Penyelesaian:
Untuk menyelesaikan kelakuan ini, kod tersebut hendaklah secara eksplisit mengambil alamat setiap keping elemen sebelum menyimpannya dalam peta:
for i := range s { m[s[i].Name] = &s[i] }
Dengan membuat perubahan ini, setiap entri peta kini merujuk hirisan sebenar alamat elemen, memastikan tingkah laku yang diharapkan. Ini menunjukkan kepentingan memahami nuansa gelung julat hirisan dan cara ia boleh mempengaruhi manipulasi data dalam Go.
Atas ialah kandungan terperinci Bagaimanakah Gelung Julat Slice Go Mempengaruhi Penetapan Alamat dalam Peta?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!