Menyahkod Gelagat Julat Slice Go
Dalam Go, slice ialah struktur data serba boleh yang menawarkan fungsi seperti tatasusunan dinamik. Apabila melelaran pada kepingan, sintaks julat menyediakan cara yang mudah untuk mengakses elemennya. Walau bagaimanapun, senario tertentu mungkin membawa kepada tingkah laku yang tidak dijangka.
Pertimbangkan kod berikut yang mencipta sekeping struct pelajar dan mengisi peta dengan rujukan kepada struct ini:
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) // map[Allen:0xc42006a0c0 Tom:0xc42006a0c0] }
Gelagat yang dijangkakan ialah bahawa peta harus mengandungi rujukan kepada setiap struct pelajar individu dalam kepingan. Walau bagaimanapun, keputusan menunjukkan bahawa kedua-dua kekunci dalam peta menghala ke alamat yang sama.
Tingkah laku ini boleh dijelaskan dengan memahami bahawa pembolehubah stu dalam gelung julat ialah salinan elemen hirisan, bukan rujukan. Nama stu.Name mendapatkan salinan medan nama dan &stu mengambil alamat salinan, menghasilkan alamat yang sama untuk semua nilai peta.
Untuk membetulkan isu ini, kod tersebut hendaklah mengambil alamat sebaliknya elemen hirisan sebenar:
for i := range s { m[s[i].Name] = &s[i] }
Dengan mengakses elemen hirisan secara langsung, kami memperoleh rujukan kepada lokasi memori uniknya, menyelesaikan tingkah laku yang tidak dijangka dan memastikan bahawa peta mengandungi rujukan kepada setiap struct pelajar.
Atas ialah kandungan terperinci Mengapakah Gelung Julat Slice Go Mencipta Gelagat Tidak Dijangka Apabila Digunakan dengan Peta?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!