Rumah > pembangunan bahagian belakang > Golang > Mengapakah Menyalin daripada Go Slice dengan Range Gelung Kadangkala Mendua Alamat Memori?

Mengapakah Menyalin daripada Go Slice dengan Range Gelung Kadangkala Mendua Alamat Memori?

Linda Hamilton
Lepaskan: 2024-12-23 19:17:15
asal
948 orang telah melayarinya

Why Does Copying from a Go Slice with a Range Loop Sometimes Duplicate Memory Addresses?

Menggunakan Semula Alamat Memori Semasa Menyalin daripada Slice dalam Go

Anda telah menemui gelagat yang pelik dalam Go di mana menyalin nilai daripada kepingan menggunakan julat gelung mengakibatkan alamat memori pendua dalam output. Untuk menyelesaikan masalah ini, anda mengubah suai kod untuk mencipta pembolehubah sementara, yang menghasilkan alamat berbeza yang dijangkakan.

Tingkah laku ini timbul kerana dalam kod asal, item pembolehubah gelung ialah penunjuk kepada elemen semasa hirisan . Semasa anda mengulangi hirisan, Go menggunakan semula pembolehubah penunjuk ini, menukar nilainya dengan setiap lelaran tetapi mengekalkan alamat memori yang sama. Akibatnya, apabila anda menetapkan &item pada kepingan output, anda secara tidak sengaja menduplikasi alamat memori yang sama beberapa kali.

Untuk mengelakkan penggunaan semula ini, kod anda yang diubah suai mencipta pembolehubah sementara i untuk menyimpan salinan elemen semasa. Ini memaksa Go untuk mencipta peruntukan memori baharu untuk setiap lelaran, menghasilkan alamat unik dalam kepingan output.

Untuk menggambarkan konsep ini, pertimbangkan contoh berikut:

package main

import "fmt"

type Region struct {
    Name string
}

func main() {
    // Create a slice of Region objects.
    regions := []Region{
        {Name: "Central"},
        {Name: "East"},
    }

    // Original code - duplicates memory addresses
    fmt.Println("Original Code:")
    models1 := make([]Model, len(regions))
    for idx, item := range regions {
        models1[idx] = &item
    }
    for _, m := range models1 {
        fmt.Println(m)
    }

    // Modified code - generates unique memory addresses
    fmt.Println("Modified Code:")
    models2 := make([]Model, len(regions))
    for idx, _ := range regions {
        i := regions[idx]
        models2[idx] = &i
    }
    for _, m := range models2 {
        fmt.Println(m)
    }
}
Salin selepas log masuk

Menjalankan kod ini , anda akan perasan bahawa kod asal mencetak alamat memori pendua, manakala kod yang diubah suai menghasilkan alamat unik.

Atas ialah kandungan terperinci Mengapakah Menyalin daripada Go Slice dengan Range Gelung Kadangkala Mendua Alamat Memori?. 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