Rumah >pembangunan bahagian belakang >Golang >Go Slices: Mengapakah Menyalin Elemen Slice Menggunakan `julat` Kadangkala Membawa kepada Alamat Memori Dikongsi?

Go Slices: Mengapakah Menyalin Elemen Slice Menggunakan `julat` Kadangkala Membawa kepada Alamat Memori Dikongsi?

Linda Hamilton
Linda Hamiltonasal
2024-12-19 02:12:09488semak imbas

Go Slices: Why Does Copying Slice Elements Using `range` Sometimes Lead to Shared Memory Addresses?

Go: Menggunakan Semula Menyalin Alamat Memori daripada Slice

Dalam Go, fungsi julat berulang pada elemen kepingan. Walau bagaimanapun, perangkap biasa ialah penggunaan semula alamat memori untuk pembolehubah gelung. Ini boleh membawa kepada hasil yang tidak dijangka apabila cuba menyalin elemen hirisan ke struktur data lain.

Pertimbangkan coretan kod berikut:

// Regions is the collection of the Region model
type Regions []Region

// Returns the model collection as a list of models
func (coll *Regions) ToModelList() []Model {
    output := make([]Model, len(*coll))
    for idx, item := range *coll {
        output[idx] = &item
    }
    return output
}

Dalam kod ini, item pembolehubah gelung ialah rujukan penuding kepada elemen dalam kepingan *coll. Dengan memperuntukkan &item kepada elemen hirisan output, berbilang elemen akhirnya menunjuk ke objek Wilayah asas yang sama. Ini berlaku kerana output dan *coll berkongsi alamat memori yang sama untuk item.

Untuk menyelesaikan isu ini, adalah perlu untuk mencipta salinan objek Rantau yang berbeza untuk setiap elemen dalam output. Ini boleh dicapai dengan menggunakan coretan kod berikut:

// Returns the model collection as a list of models
func (coll *Regions) ToModelList() []Model {
    output := make([]Model, len(*coll))
    for idx, _ := range *coll {
        i := (*coll)[idx]
        output[idx] = &i
    }
    return output
}

Dalam kod yang disemak ini, _ digunakan sebagai pembolehubah gelung untuk julat atas *coll. Ini memastikan bahawa salinan baharu i dicipta untuk setiap lelaran, menghalang penggunaan semula alamat memori merentas lelaran gelung.

Memahami nuansa pengurusan memori Go adalah penting untuk mengelakkan jenis perangkap ini dan memastikan pelaksanaan program yang betul .

Atas ialah kandungan terperinci Go Slices: Mengapakah Menyalin Elemen Slice Menggunakan `julat` Kadangkala Membawa kepada Alamat Memori Dikongsi?. 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