Rumah > Artikel > pembangunan bahagian belakang > Golang generik - tidak boleh menggunakan jenis dan bukannya jenis yang sama apabila menghantar penunjuk fungsi
Saya baru mengenali golang dan saya sedang mengusahakan struktur berikut:
<code>type Flag[T any] struct { defaultValue interface{} } </code>
Antaranya T
可以是 int
或 bool
Saya takrifkan fungsi berikut:
<code>func (f Flag[T]) GetVariation(val interface{}, getFunc func(v T) T ) T { inputVal := f.defaultValue.(T) return getFunc(inputVal) } </code>
Apabila saya cuba menggunakan fungsi di atas untuk pelbagai jenis data seperti bool, menggunakan yang berikut:
<code>func (f Flag[bool]) GetBoolVariation(val bool) bool { return f.GetVariation(val, someFunc) } func someFunc(v bool) bool { return true } </code>
Saya mendapat mesej ralat berikut:
cannot use someFunc (value of type func(v bool) bool) as func(v bool) bool value in argument to f.GetVariation
Mesej sangat mengelirukan kerana ia mengatakan saya tidak boleh menggunakan "X" sebagai "X". Bolehkah anda membantu saya mengetahui apa yang saya lakukan salah di sini?
Pertama sekali, sukar untuk mengukur kes penggunaan anda yang lebih besar di sini, tetapi generik mungkin tidak sesuai di sini kerana anda sedang melakukan semakan jenis masa jalan (seperti f.defaultValue.(T)
).
Kedua, anda nampaknya menggunakan go 1.20
, yang menghasilkan ralat yang mengelirukan:
https://www.php.cn/link/63e8e3643e7f7198858eef325b0600f9
cannot use someFunc (value of type func(v bool) bool) as func(v bool) bool value in argument to f.GetVariation
Menggunakan versi Playground terkini (go 1.21
sehingga berita ini ditulis) memberikan ralat kompilasi yang lebih terperinci:
https://www.php.cn/link/2d1bcedd27b586d2a9562a0f8e076b41
./prog.go:14:29: cannot use someFunc (value of type func(v bool) bool) as func(v bool /* with bool declared at ./prog.go:13:14 */) bool /* with bool declared at ./prog.go:13:14 */ value in argument to f.GetVariation
Menunjukkan jenis bool
被指定的位置 (./prog.go:13:14
) berasal daripada kekangan jenis.
Jadi hanya kerana kekangan jenis ini bool
sepadan dengan tandatangan fungsi bukan generik:
func someFunc(v bool) bool { return true }
tidak bermakna ia adalah padanan kompilasi yang tepat.
Anda boleh "menyelesaikan" ralat kompilasi menggunakan contoh rekaan ini :
func someFuncFix[T any](v T) T { return v } func (f Flag[bool]) GetBoolVariation(val bool) bool { return f.GetVariation(val, someFuncFix[bool]) // FYI: `return f.GetVariation(val, someFuncFix)` also works as the bool constraint could be inferred }
Tetapi sekali lagi, saya rasa generik mungkin bukan penyelesaian terbaik untuk kes penggunaan khusus anda.
Atas ialah kandungan terperinci Golang generik - tidak boleh menggunakan jenis dan bukannya jenis yang sama apabila menghantar penunjuk fungsi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!