Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Melepasi Nilai Antara Muka Tiada Menggunakan Refleksi dalam Go?
Dalam Go, anda boleh mentakrifkan fungsi dengan argumen antara muka. Walaupun mudah untuk menghantar nilai antara muka bukan nol, persoalan timbul: bagaimana anda menghantar nilai nil melalui pantulan supaya ia melepasi semakan == nil?
Pertimbangkan fungsi berikut:
func f(e error) { if e == nil { fmt.Println("YEY! NIL") // how to get here? } else { fmt.Println("NOT NIL :(") } }
func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil) }
Pendekatan ini gagal kerana reflect.Zero(reflect.TypeOf((error)(nil))) panik kerana anda tidak boleh mencipta nilai sifar jenis nol.
type MyError struct{} func (e MyError) Error() string { return "" } func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf(&MyError{})) // NOT NIL :( }
Pendekatan ini juga gagal disebabkan oleh item Soalan Lazim Go mengenai ralat nil, yang menyatakan bahawa jenis Antara muka boleh menjadi sifar atau menunjuk kepada jenis tertentu. Melepasi nil secara khusus bukan perkara biasa. Jika anda cuba memanggil kaedah pada antara muka nil, ia akan panik.
Untuk melepasi nol dengan betul nilai melalui refleksi, gunakan ungkapan reflect.TypeOf((*error)(nil)).Elem() untuk mendapatkan reflect.Type untuk antara muka ralat. Ungkapan ini mencipta nilai bukan antara muka dan menggunakan kaedah pantulan untuk mendapatkan pantulan yang diingini. Jenis.
Buat nilArg seperti berikut:
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
Dengan pendekatan ini, memanggil f dengan nilArg akan mencetak "YEY! NIL."
Lihat contoh taman permainan untuk pelaksanaan yang berfungsi.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melepasi Nilai Antara Muka Tiada Menggunakan Refleksi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!