Mengapa reflect.MakeSlice Mengembalikan Nilai Tidak Boleh Diatasi
Dalam Go, pakej reflect menyediakan antara muka untuk memeriksa dan memanipulasi jenis dan nilai. reflect.MakeSlice mencipta kepingan jenis tertentu. Walau bagaimanapun, nilai yang dikembalikan tidak boleh ditangani. Ini bermakna anda tidak boleh mengambil alamatnya atau menetapkannya pada penuding.
Penyelesaian: Menggunakan reflect.New()
Untuk mendapatkan kepingan boleh dialamatkan menggunakan pantulan, anda boleh menggunakan fungsi reflect.New() untuk mencipta penunjuk ke hirisan. Ini boleh dilakukan seperti berikut:
// Create the slice type sliceType := reflect.SliceOf(SomeType) // Create a slice using reflect.MakeSlice slice := reflect.MakeSlice(sliceType, 10, 10) // Create a pointer to the slice slicePtr := reflect.New(slice.Type()) // Set the slice pointer to the slice slicePtr.Elem().Set(slice)
Sekarang, anda mempunyai kepingan boleh dialamatkan yang boleh dihantar sebagai hujah kepada fungsi yang memerlukan penuding hirisan.
Mengapa merenung. MakeSlice Mengembalikan Nilai Tidak Boleh Diatasi
Pembolehubah tindanan setempat dalam Go tidak boleh ditangani kerana masa jalan mungkin bergerak mereka ke timbunan pada bila-bila masa. reflect.MakeSlice mencipta pembolehubah hirisan setempat, itulah sebabnya nilai yang dikembalikan tidak boleh ditangani.
Mengapa Penunjuk kepada Slice Diperlukan
Sesetengah API, seperti seperti yang anda nyatakan dari pakej mgo, memerlukan penunjuk ke sekeping sebagai hujah. Ini kerana apabila dilampirkan pada kepingan, kepingan baharu dengan kapasiti meningkat mungkin diperuntukkan. Jika anda melepasi kepingan bukan penuding, perubahan yang dibuat pada kepingan tidak akan kelihatan di luar fungsi.
Atas ialah kandungan terperinci Mengapakah Fungsi `reflect.MakeSlice` Mengembalikan Nilai Tidak Boleh Diatasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!