Pergi Refleksi dengan Antara Muka Terbenam dalam Struktur: Mengenalpasti Fungsi "Sebenar"
Pertimbangkan coretan kod berikut:
type A interface { Foo() string } type B struct { A bar string }
Menurut pendekatan idiomatik Go, pola di atas menunjukkan bahawa B mesti melaksanakan antara muka A. Walau bagaimanapun, tidak seperti bahasa OOP, tiada semakan masa kompilasi untuk ini. Sebaliknya, anda boleh memilih untuk melaksanakan hanya sebahagian daripada antara muka.
Refleksi membolehkan anda mendapatkan semula kaedah A terus daripada jenis B, walaupun tiada kaedah dengan penerima B hadir. Walau bagaimanapun, ini menimbulkan persoalan: bagaimana anda boleh mengesan jika pelaksanaan "sebenar" wujud sebelum mencetuskan panik?
Untuk menyelesaikannya, anda tidak boleh bergantung pada refleksi sahaja. Sebaliknya, pertimbangkan untuk menggunakan pendekatan yang mudah:
method_in_table := B.Foo // Check if the method is nil if method_in_table == nil { fmt.Println("No real implementation found") } else { // Method is present }
Sebagai alternatif, anda boleh menggunakan semakan berasaskan pantulan berikut:
bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo") if !has || bMeth.Func.ptr.IsZero() { // No real implementation found } else { // Method is present }
Dalam senario ini, semak sama ada medan ptr bMeth fungsi sifar membolehkan anda menentukan sama ada fungsi itu berada dalam jadual fungsi nilai antara muka tanpa nama. Jika sifar, tiada kaedah yang sepadan dalam struct B, menunjukkan kekurangan pelaksanaan sebenar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengesan Pelaksanaan Antara Muka 'Sebenar' dalam Go Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!