Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Golang generik - tidak boleh menggunakan jenis dan bukannya jenis yang sama apabila menghantar penunjuk fungsi

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

PHPz
PHPzke hadapan
2024-02-06 10:33:03521semak imbas

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

Kandungan soalan

Saya baru mengenali golang dan saya sedang mengusahakan struktur berikut:

<code>type Flag[T any] struct {
    defaultValue interface{}
}
</code>

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>

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?


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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam