Rumah > pembangunan bahagian belakang > Golang > Mengapakah Gelung Julat Slice Go Mencipta Gelagat Tidak Dijangka Apabila Digunakan dengan Peta?

Mengapakah Gelung Julat Slice Go Mencipta Gelagat Tidak Dijangka Apabila Digunakan dengan Peta?

Linda Hamilton
Lepaskan: 2024-12-09 01:54:12
asal
406 orang telah melayarinya

Why Does Go's Slice Range Loop Create Unexpected Behavior When Used with Maps?

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]
}
Salin selepas log masuk

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]
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan