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

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

Patricia Arquette
Patricia Arquetteasal
2024-11-07 21:56:03877semak imbas

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)

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())

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

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!

Kenyataan:
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