Di Golang, nilai nil tidak boleh diberikan secara langsung kepada jenis antara muka. Ini kerana nil mewakili ketiadaan nilai, manakala antara muka bertujuan untuk mewakili penunjuk kepada nilai. Apabila cuba menghantar nilai sifar kepada hujah antara muka, atur cara menyemak sama ada hujah adalah sifar dan mungkin mengembalikan ralat atau berkelakuan dalam cara yang tidak dijangka.
Untuk memintas isu ini, refleksi boleh digunakan untuk mencipta sifar nilai yang boleh dihantar kepada hujah antara muka dan lulus semakan nil. Refleksi membenarkan akses program kepada jenis dan nilai asas pembolehubah.
Penyelesaian:
Gunakan ungkapan reflect.TypeOf((*error)(nil)).Elem () untuk mendapatkan pantulan.Taip untuk ralat antara muka. Ungkapan ini menggunakan nilai bukan antara muka, *ralat, untuk mendapatkan pantulan yang betul. Jenis. Selepas itu, Elem dipanggil pada hasil untuk mendapatkan refleksi. Jenis untuk ralat.
Untuk mencipta nilArg, gunakan ungkapan berikut:
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
Ungkapan ini mencipta nilai nil jenis kesilapan. Isu asal timbul kerana reflect.TypeOf((error)(nil)) mengembalikan sifar, kerana jenis konkrit nilai antara muka sifar ialah sifar.
Contoh:
func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem()) rf.Call([]reflect.Value{nilArg}) }
Penyelesaian ini membenarkan fungsi f menerima nilai nil dan lulus semakan == nil.
Atas ialah kandungan terperinci Bagaimanakah Refleksi dalam Go Boleh Mengendalikan Nilai Sifar kepada Argumen Antaramuka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!