Rumah > pembangunan bahagian belakang > Golang > Mengapakah `reflect.MakeSlice` Mengembalikan Nilai Tidak Boleh Diatasi dalam Go?

Mengapakah `reflect.MakeSlice` Mengembalikan Nilai Tidak Boleh Diatasi dalam Go?

Patricia Arquette
Lepaskan: 2024-11-07 21:56:03
asal
984 orang telah melayarinya

Why Does `reflect.MakeSlice` Return an Un-addressable Value in Go?

Mengapa reflect.MakeSlice Mengembalikan Nilai Tidak Boleh Diatasi dalam Go

Gambaran Keseluruhan Masalah

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)
Salin selepas log masuk

Mendapatkan Penunding kepada Slice Menggunakan Refleksi

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())
Salin selepas log masuk

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)
}
Salin selepas log masuk

Mengapa mencerminkan.MakeSlice Mengembalikan Nilai yang Tidak Boleh Diatasi

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.

Mengapa Penunjuk kepada Slice Diperlukan

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!

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