Rumah >pembangunan bahagian belakang >Golang >Mengapa Go Slice Range Gelung Berikan Alamat Yang Sama kepada Kekunci Peta Apabila Menggunakan `&stu`?

Mengapa Go Slice Range Gelung Berikan Alamat Yang Sama kepada Kekunci Peta Apabila Menggunakan `&stu`?

Susan Sarandon
Susan Sarandonasal
2024-12-06 04:14:10560semak imbas

Why Do Go Slice Range Loops Assign the Same Address to Map Keys When Using `&stu`?

Mengetahui Fenomena Julat Go Slice

Dalam coretan kod yang disediakan, sepotong struct pelajar diulang menggunakan kata kunci julat. Walau bagaimanapun, penugasan alamat pelajar pada peta mendedahkan isu yang kelihatan membingungkan: kekunci peta yang terhasil mempunyai alamat yang sama.

Untuk memahami fenomena ini, adalah penting untuk menyedari bahawa dalam Go, kata kunci julat berulang sepanjang elemen kepingan, bukan alamat. Ini bermakna pembolehubah stu dalam gelung julat ialah salinan elemen hirisan. Akibatnya, apabila alamat stu diambil dan diberikan kepada kunci peta, alamat salinan, bukan elemen hirisan, disimpan.

Untuk membetulkannya, seseorang perlu mengubah suai kod untuk mengambil secara eksplisit alamat unsur hirisan. Ini boleh dicapai dengan menggunakan pembolehubah indeks hirisan i:

for i := range s {
    m[s[i].Name] = &s[i]
}

Pengubahsuaian ini memastikan kekunci peta memegang alamat elemen hirisan sebenar.

Dengan memahami perbezaan antara mengulang semula elemen slice dan mengambil alamatnya, pembangun boleh mengelakkan kemungkinan kekeliruan dan memastikan gelagat kod mereka yang dimaksudkan apabila bekerja dengan slice dalam Go.

Atas ialah kandungan terperinci Mengapa Go Slice Range Gelung Berikan Alamat Yang Sama kepada Kekunci Peta Apabila Menggunakan `&stu`?. 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