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!