Apabila cuba mengimport pemalam yang melaksanakan antara muka yang ditakrifkan di luar kedua-dua pakej, mengikat simbol pemalam kepada antara muka gagal. Ini berlaku walaupun pelaksanaan struktur pemalam bagi antara muka.
Isu timbul daripada pendekatan mencari pembolehubah daripada pemalam, yang mengembalikan penunjuk kepada pembolehubah itu. Untuk menaip menegaskan antara muka daripada nilai jenis penunjuk ke antara muka tidak pernah berjaya. Sebaliknya, penyelesaiannya ialah mengeksport fungsi daripada pemalam yang mengembalikan jenis antara muka yang diingini.
func Greeter() iface.IPlugin { return testpl{} }
Pakej pemalam beroperasi dengan mengembalikan penunjuk kepada nilai apabila mencari pembolehubah. Untuk pembolehubah jenis iface.IPlugin, ini menghasilkan penuding kepada antara muka, yang tidak boleh ditaip ditegaskan kepada iface.IPlugin.
Dengan mengembalikan fungsi daripada pemalam, operasi carian tidak lagi memerlukan penuding . Fungsi itu kemudiannya boleh digunakan untuk mendapatkan nilai antara muka yang diingini.
Untuk menggunakan pendekatan ini, definisi pemalam harus dikemas kini untuk mendedahkan fungsi yang mengembalikan pelaksanaan antara muka. Program kemudiannya boleh mencari fungsi ini dan menggunakannya untuk mendapatkan contoh penyambut.
// In the plugin func Greeter() iface.IPlugin { return testpl{} } // In the main program Greeter, err := p.Lookup("Greeter") if err != nil { panic(err) } greeterFunc, ok := Greeter.(func() iface.IPlugin) if !ok { panic(errors.New("not of expected type")) } greeter := greeterFunc()
Pendekatan ini mengelakkan kerumitan penegasan jenis tidak langsung dan kekeliruan yang disebabkan oleh penggunaan penunjuk. Selain itu, ia selaras dengan cara yang lebih intuitif untuk mendedahkan fungsi daripada pemalam.
Atas ialah kandungan terperinci Mengapa Mengembalikan Simbol Pemalam sebagai Fungsi Menyelesaikan Isu Pengikatan Antara Muka Pemalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!