Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengesan Pelaksanaan Antara Muka 'Sebenar' dalam Go Menggunakan Refleksi?

Bagaimanakah Saya Boleh Mengesan Pelaksanaan Antara Muka 'Sebenar' dalam Go Menggunakan Refleksi?

Patricia Arquette
Lepaskan: 2024-12-23 22:29:19
asal
440 orang telah melayarinya

How Can I Detect a

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan