Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Melepasi Nilai Antara Muka Tiada Menggunakan Refleksi dalam Go?

Bagaimanakah Saya Boleh Melepasi Nilai Antara Muka Tiada Menggunakan Refleksi dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-30 14:10:14314semak imbas

How Can I Pass a Nil Interface Value Using Reflection in Go?

Melalui Nilai Sifar sebagai Antara Muka melalui 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 :(")
    }
}

Pendekatan 1: Menggunakan reflect.Zero

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.

Pendekatan 2: Menggunakan Typeof(&type)

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.

Penyelesaian: Gunakan TypeOf((*error)(nil)).Elem()

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!

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