Golang generik - tidak boleh menggunakan jenis dan bukannya jenis yang sama apabila menghantar penunjuk fungsi

PHPz
Lepaskan: 2024-02-06 10:33:03
ke hadapan
491 orang telah melayarinya

Golang 泛型 - 在传递函数指针时不能使用类型代替相同类型

Kandungan soalan

Saya baru mengenali golang dan saya sedang mengusahakan struktur berikut:

<code>type Flag[T any] struct {
    defaultValue interface{}
}
</code>
Salin selepas log masuk

Antaranya T 可以是 intbool

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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
Salin selepas log masuk

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?


Jawapan betul


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
Salin selepas log masuk

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
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!