Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menentukan sama ada Go Struct dengan Antara Muka Terbenam Mempunyai Pelaksanaan Fungsi 'Sebenar' Menggunakan Refleksi?

Bagaimanakah Saya Boleh Menentukan sama ada Go Struct dengan Antara Muka Terbenam Mempunyai Pelaksanaan Fungsi 'Sebenar' Menggunakan Refleksi?

DDD
DDDasal
2024-12-26 18:04:11441semak imbas

How Can I Determine if a Go Struct with an Embedded Interface Has a

Go Reflection dengan Antara Muka Terbenam dalam Struct: Menentukan Fungsi "Sebenar"

Dalam konteks pakej refleksi Go, memahami tingkah laku struct medan yang dibenamkan dengan antara muka tanpa nama adalah penting. Pertimbangkan coretan kod berikut:

type A interface {
    Foo() string
}

type B struct {
    A
    bar string
}

Walaupun intuitif untuk menganggap bahawa B mesti melaksanakan antara muka A, sifat dinamik Go membolehkan tafsiran yang berbeza. Nilai antara muka tanpa nama yang dibenamkan dalam B berfungsi sebagai medan, serupa dengan medan struktur lain.

Menggunakan refleksi, anda boleh mendapatkan semula kaedah daripada jenis B seperti berikut:

bType := reflect.TypeOf(B{})
bMeth, has := bType.MethodByName("Foo")

Walau bagaimanapun, kehadiran bMeth tidak menjamin kewujudan pelaksanaan fungsi "sebenar" untuk B. Untuk mengelakkan panik seperti yang anda temui, anda memerlukan cara untuk menentukan sama ada terdapat fungsi sebenar yang ditakrifkan untuk B.

Mengesan Ketiadaan Pelaksanaan

Kunci untuk membezakan antara fungsi "sebenar" dan kaedah antara muka yang diwarisi terletak pada Antara Muka aspek antara muka tanpa nama terbenam. Apabila tiada pelaksanaan eksplisit wujud dalam struct, kaedah antara muka diwarisi dengan berkesan daripada antara muka terbenam.

Untuk menyemak kehadiran fungsi sebenar:

if bMeth.Type.NumIn() == 1 && bMeth.Type.NumOut() == 1 {
    fmt.Println("Real function found")
} else {
    fmt.Println("Interface method inherited")
}

Semakan ini memeriksa nombor parameter input dan output untuk kaedah yang diambil. Jika kedua-duanya adalah 1, ia menunjukkan bahawa kaedah itu adalah pelaksanaan fungsi "sebenar", kerana ia menerima satu parameter penerima (contoh B) dan mengembalikan satu nilai. Jika tidak, jika nombor ini berbeza, kaedah ini diwarisi daripada antara muka.

Pendekatan Alternatif: Penukaran Jenis

Daripada menggunakan pantulan, anda boleh menggunakan penukaran jenis kepada secara terpilih laksanakan berdasarkan jenis dinamik b.A. Jika b.A adalah sifar, ia menunjukkan ketiadaan pelaksanaan "sebenar".

switch b.A.(type) {
case nil:
    fmt.Println("No function implementation in B")
default:
    fmt.Println("Function implementation found")
}

Kesimpulan

Dengan memahami sifat antara muka tanpa nama tertanam dan menggunakan sama ada refleksi dengan pemeriksaan tersuai atau penukaran jenis, anda boleh menentukan dengan berkesan kehadiran fungsi "sebenar" untuk medan struct yang mewarisi antara muka kaedah.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan sama ada Go Struct dengan Antara Muka Terbenam Mempunyai Pelaksanaan Fungsi 'Sebenar' Menggunakan Refleksi?. 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