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) } }
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!