Type Func with Interface Parameter Incompatibility
Apabila mentakrifkan jenis fungsi yang menerima sebarang nilai yang mematuhi antara muka, ia mungkin mengelirukan untuk ditemui ralat semasa menggunakan fungsi yang kelihatan sepadan dengan spesifikasi itu.
Pertimbangkan perkara berikut contoh:
type myfunc func(x interface{}) func a(num int) { return } func b(f myfunc) { f(2) return } func main() { b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b return }
Ralat timbul kerana antara muka dalam Go mempamerkan invarian, bermakna walaupun int boleh dihantar ke fungsi yang mengharapkan antara muka{}, perkara yang sama tidak benar untuk func(int) dan func(antara muka{}).
Dalam Go, fungsi dengan jenis yang serasi mesti mempunyai parameter dan jenis pulangan yang sama. Memandangkan func(int) dan func(antara muka{}) tidak memenuhi keperluan ini, Go menganggapnya sebagai tidak serasi.
Untuk menyelesaikan isu ini, pertimbangkan untuk menggunakan pendekatan 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) }
Dalam contoh ini, func(int)int dihantar kepada antara muka fungsi yang mengharapkan{}. Ini dibenarkan kerana func(int)int melaksanakan antara muka{} yang memerlukannya mempunyai satu kaedah dengan input dan jenis pulangan yang ditentukan.
Untuk penjelasan lebih terperinci tentang varians dalam Go, rujuk artikel Wikipedia tentang subjek dan catatan blog dipautkan dalam jawapan yang disediakan.
Atas ialah kandungan terperinci Mengapa Pergi Melaporkan Ralat Apabila Melepasi Fungsi dengan Jenis Parameter Tertentu kepada Fungsi Menerima Parameter{} Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!