Taip func dengan Parameter Antara Muka Tidak Serasi: Memahami Varian
Dalam Go, menghadapi "tidak boleh menggunakan (type func(int)) sebagai taip myfunc dalam argumen kepada ralat b" apabila menggunakan fungsi dengan parameter antara muka boleh membingungkan. Isu ini timbul disebabkan oleh konsep varians dalam sistem jenis.
Antara muka Go tidak mempamerkan varians, bermakna antara muka tidak berkelakuan secara kovarian seperti dalam beberapa bahasa pengaturcaraan lain. Apabila jenis x melaksanakan antara muka ii, ia tidak membayangkan bahawa func(x) melaksanakan func(ii).
Dalam contoh yang disediakan, ralat berlaku kerana func(int) tidak serasi dengan func(antara muka{ }), walaupun int boleh diserahkan kepada antara muka{}. Ketidakserasian ini timbul daripada fakta bahawa antara muka tidak berkelakuan secara kovarian dalam Go.
Untuk menangani isu ini, anda boleh menghantar func(int) ke dalam fungsi yang mengharapkan antara muka{}, seperti yang ditunjukkan dalam contoh berikut:
package main import "fmt" func foo(x interface{}) { fmt.Println("foo", x) } func add2(n int) int { return n + 2 } func main() { foo(add2) }
Ini berfungsi kerana func(int)int melaksanakan antara muka{}, dengan berkesan "melebarkan" jenis kepada antara muka yang lebih generik taip.
Untuk penjelasan lanjut, rujuk artikel Wikipedia tentang varians dan catatan blog terpaut yang meneroka varians dalam pelbagai bahasa pengaturcaraan, terutamanya bahasa yang menyokong warisan.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menghantar `func(int)` kepada Fungsi Menjangkakan `func(antara muka{})` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!