Rumah >pembangunan bahagian belakang >Golang >Mengapa Menyalin daripada Go Slice Mengakibatkan Penggunaan Semula Alamat Memori, dan Bagaimana Ia Boleh Dibetulkan?
Alamat Memori Guna Semula apabila Menyalin daripada Golang Slice
Salah faham biasa dalam pengaturcaraan Go berkisar pada penyalinan alamat memori daripada kepingan. Pertimbangkan situasi berikut:
Anda mempunyai antara muka Model dan struct Wilayah yang melaksanakannya. Antara muka dilaksanakan pada penunjuk struct Wilayah. Anda juga mempunyai koleksi Regions, iaitu sepotong objek Region. Anda mempunyai kaedah untuk menukar objek Kawasan kepada []Model:
// 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 }
Apabila anda menjalankan kod ini, anda akan menjangkakan untuk mendapatkan alamat yang berbeza untuk setiap Model dalam kepingan output. Walau bagaimanapun, anda akan mendapat penuding pertama ke Rantau yang dikeluarkan beberapa kali.
Untuk menyelesaikan isu ini, pertimbangkan item pembolehubah gelung dalam kaedah asal. Ia adalah sama untuk setiap lelaran gelung, jadi kepingan yang terhasil mengandungi rujukan kepada data asas yang sama.
Penyelesaian yang berfungsi, sebaliknya, menggunakan i := (*coll)[idx] untuk buat pembolehubah baharu untuk setiap lelaran. Ini memastikan bahawa setiap Model dalam kepingan output mempunyai alamat memori yang unik.
Untuk pemahaman yang lebih baik, pertimbangkan coretan kod berikut:
func main() { coll := []int{5, 10, 15} for i, v := range coll { fmt.Printf("This one is always the same; %v\n", &v) fmt.Println("This one is 4 bytes larger each iteration; %v\n", &coll[i]) } }
Kod ini menunjukkan bahawa alamat memori v kekal sama sepanjang gelung, manakala alamat memori coll[i] meningkat dengan setiap lelaran. Tingkah laku ini disebabkan oleh v ialah pembolehubah gelung, yang kekal malar, manakala coll[i] ialah pembolehubah baharu untuk setiap lelaran.
Atas ialah kandungan terperinci Mengapa Menyalin daripada Go Slice Mengakibatkan Penggunaan Semula Alamat Memori, dan Bagaimana Ia Boleh Dibetulkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!