Rumah >pembangunan bahagian belakang >Golang >Mengapa Lelaran Julat Slice dalam Pergi Kadangkala Mengembalikan Salinan Daripada Alamat?

Mengapa Lelaran Julat Slice dalam Pergi Kadangkala Mengembalikan Salinan Daripada Alamat?

DDD
DDDasal
2024-12-05 15:54:14206semak imbas

Why Do Slice Range Iterations in Go Sometimes Return Copies Instead of Addresses?

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!

Kenyataan:
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