Simbol Pemalam sebagai Fungsi Kembali
Dalam Go, adalah mungkin untuk mengimport pemalam yang melaksanakan antara muka biasa yang ditakrifkan di luar kedua-dua pakej. Apabila mengembalikan struct daripada pemalam, antara muka dilaksanakan dengan betul. Walau bagaimanapun, percubaan untuk mengembalikan antara muka secara langsung gagal disebabkan oleh teknikal tertentu dalam sistem pemalam Go.
Puncanya terletak pada sifat simbol pemalam. Apabila mencari pembolehubah bernama Greeter daripada pemalam menggunakan Plugin.Lookup(), ia mengembalikan penunjuk kepada pembolehubah itu. Ini adalah perlu untuk membolehkan perubahan dibuat pada pembolehubah dalam pemalam.
Mencetak jenis nilai yang disimpan dalam sym akan mendedahkan sama ada ia adalah penunjuk kepada antara muka (iface.IPlugin) atau nilai antara muka sebenar (iface.IPlugin). Dalam kes pemalam mengembalikan struct, nilai yang disimpan dalam sym adalah daripada jenis main.testpl, yang melaksanakan iface.IPlugin, jadi penegasan jenis berjaya.
Walau bagaimanapun, apabila pemalam mengembalikan iface .IPlugin, nilai yang disimpan dalam sym adalah jenis *iface.IPlugin. Penunjuk kepada nilai antara muka ini tidak memenuhi mana-mana antara muka secara langsung, termasuk iface.IPlugin. Oleh itu, penegasan jenis gagal.
Untuk memintas isu ini, pemalam boleh diubah suai untuk mendedahkan fungsi yang mengembalikan antara muka Greeter dan bukannya pembolehubah global:
func Greeter() iface.IPlugin { return testpl{} }
Ini akan mendedahkan simbol bernama Greeter dengan jenis func() iface.IPlugin. Apabila dicari menggunakan Plugin.Lookup(), ia akan mengembalikan penunjuk fungsi. Ini menghapuskan keperluan untuk penunjuk kepada nilai antara muka dan membolehkan penegasan jenis yang betul:
greeterFunc, ok := GetFilter.(func() iface.IPlugin) if !ok { panic(errors.New("not of expected type")) } greeter := greeterFunc()
Kaedah ini menyediakan pendekatan yang lebih jelas dan konsisten untuk mendedahkan fungsi pemalam sambil mengelakkan perangkap yang berkaitan dengan mengembalikan antara muka secara langsung daripada pemalam.
Atas ialah kandungan terperinci Mengapa Pemalam Go Gagal Mengembalikan Antara Muka Secara Terus, dan Bagaimanakah Ini Boleh Diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!