Rumah > pembangunan bahagian belakang > Golang > Mengapakah Go Slice Range Loop Mencipta Alamat Dikongsi Apabila Memetakan Struktur?

Mengapakah Go Slice Range Loop Mencipta Alamat Dikongsi Apabila Memetakan Struktur?

Linda Hamilton
Lepaskan: 2024-12-04 22:44:11
asal
506 orang telah melayarinya

Why Do Go Slice Range Loops Create Shared Addresses When Mapping Structs?

Memahami Fenomena Julat Go Slice

Masalah: Gelagat Julat Slice Misterius

Dalam Go, slice ialah struktur data yang berkuasa yang boleh diulang lebih menggunakan kata kunci julat. Walau bagaimanapun, dalam fenomena pelik, apabila melelaran pada sekeping struct menggunakan julat-untuk, unsur-unsur dalam peta yang terhasil berkongsi alamat yang sama. Tingkah laku ini boleh mengelirukan, terutamanya kerana elemen dalam kepingan asal sepatutnya mempunyai alamat yang unik.

Penjelasan: The Gotcha of Local Variables

Kunci untuk memahami fenomena ini terletak pada cara pembolehubah berada tersimpan dalam ingatan. Apabila mengakses elemen hirisan dalam gelung julat untuk (stu dalam kes ini), stu pembolehubah tempatan memegang salinan struct. Menetapkan penuding kepada pembolehubah setempat secara berkesan menghalakan semua elemen dalam peta ke salinan struct yang sama dalam ingatan.

Menyelesaikan Isu: Melewati Alamat Elemen Slice

Untuk menyelesaikan isu ini dan tetapkan alamat unsur hirisan, kod tersebut mesti diubah suai untuk mengambil alamat unsur hirisan itu sendiri. Dengan menggunakan s[i] dan bukannya stu, penuding kepada elemen sebenar dalam hirisan ditetapkan pada peta.

Contoh: Menunjukkan Penyelesaian

package main

import "fmt"

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 i := range s {
        m[s[i].Name] = &s[i] // Change here
    }
    fmt.Println(m)
    for key, value := range m {
        fmt.Println(key, value)
    }
}
Salin selepas log masuk

Output:

map[Allen:0xc0000a6058 Tom:0xc0000a6060]
Allen &{Allen 24}
Tom &{Tom 23}
Salin selepas log masuk

Kesimpulan

Dengan memahami tingkah laku pengurusan memori yang mendasari, kita boleh menangani bahagian ini fenomena julat dalam Go. Dengan mengambil alamat elemen hirisan itu sendiri, kami memastikan setiap elemen dalam peta menghala ke struct unik dalam ingatan, mengekalkan integriti data.

Atas ialah kandungan terperinci Mengapakah Go Slice Range Loop Mencipta Alamat Dikongsi Apabila Memetakan Struktur?. 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