Antara Muka Tersuai dalam Pemalam Go
Soalan: Bagaimanakah saya boleh menggunakan antara muka tersuai dengan pemalam Go?
Latar Belakang: Antara muka tersuai adalah penting untuk melaksanakan boleh guna semula dan komponen perisian yang boleh diperluaskan. Walau bagaimanapun, percubaan awal untuk menggunakannya dalam pemalam Go mengakibatkan ralat berikut:
panic: interface conversion: plugin.Symbol is func() (filter.Filter, error), not func() (filter.Filter, error)
Jawapan:
Sementara pemalam Go tidak boleh mengakses jenis yang ditentukan dalam pemalam itu sendiri , adalah mungkin untuk menggunakan antara muka tersuai dengan mengikut kaedah ini:
1. Menggunakan Pakej Biasa:
Tentukan antara muka dalam pakej yang diimport oleh pemalam dan aplikasi utama. Pendekatan ini membolehkan kedua-dua komponen menggunakan definisi jenis yang sama.
2. Mengembalikan Antara Muka{} daripada Pemalam:
Minta fungsi pemalam mengembalikan nilai antara muka jenis{}. Aplikasi utama kemudiannya boleh mentakrifkan penegasan jenis pada nilai yang dikembalikan untuk menggunakan antara muka tersuai.
Contoh:
Utama Aplikasi:
package main import ( "fmt" "plugin" "github.com/fagongzi/gateway/pkg/filter" ) func main() { // ... GetInstance(func() (filter.Filter, error)) // Error occurs }
Pemalam:
package plugin import "github.com/fagongzi/gateway/pkg/filter" type plgFilter struct{} func (plgFilter) Name() string { return "Bob" } func (plgFilter) Age() int { return 23 } // Return an "empty" filter to satisfy the function signature func GetInstance() (filter.Filter, error) { return nil, nil } func GetInstanceInter() (interface{}, error) { return &plgFilter{}, nil } func GetInstancePtr() (*plgFilter, error) { return &plgFilter{}, nil }
Perbandingan:
Nota Tambahan:
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Antara Muka Tersuai dengan Berkesan dalam Pemalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!