Dalam Go, menggunakan reflect.MakeSlice untuk mencipta kepingan mengembalikan Nilai tidak boleh ditangani. Ini menjadi isu apabila alamat hirisan diperlukan, seperti yang ditunjukkan dalam coretan kod berikut:
collection.Find(bson.M{}).All(&result)
Untuk menyelesaikan isu ini, terdapat dua penyelesaian:
1. Menggunakan reflect.New()
Penyelesaian paling mudah ialah menggunakan reflect.New() untuk mencipta penunjuk. Contohnya:
my := &My{} // Create a slice to begin with myType := reflect.TypeOf(my) slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10) // Create a pointer to a slice value and set it to the slice x := reflect.New(slice.Type()) x.Elem().Set(slice) collection.Find(bson.M{}).All(x.Interface())
2. Menggunakan Peta yang Ditaip
Sebagai alternatif, anda boleh menggunakan peta yang ditaip untuk membuat sekeping jenis yang diingini:
type MyStructList map[string]*MyStruct myMap := reflect.New(reflect.MapOf(myKey, myValue)) for _, value := range myMap.MapKeys() { myValue := myMap.MapIndex(value) }
Pembolehubah tindanan setempat, termasuk yang dibuat oleh reflect.MakeSlice, tidak boleh ditangani dalam Go. Ini memastikan bahawa penunjuk kepada pembolehubah ini kekal bermakna dan tidak menunjuk ke lokasi memori yang tidak sah.
API mgo memerlukan penuding kepada kepingan untuk iternya .Semua berfungsi kerana penambahan pada kepingan mungkin mengagihkan semula memori. Untuk menyampaikan perubahan ini kepada pemanggil, penunjuk diperlukan.
Atas ialah kandungan terperinci Mengapakah `reflect.MakeSlice` Mengembalikan Nilai Tidak Boleh Diatasi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!