Rumah > Artikel > pembangunan bahagian belakang > Bolehkah Go 1.18 Generics Mengendalikan Jenis Kontravarian dalam Tandatangan Fungsi?
Generik dengan Jenis Kontravarian dalam Go 1.18: Penjelasan dan Pengehadan
Usaha untuk mentakrifkan fungsi menggunakan generik dalam Go 1.18 yang mengambil dua fungsi dengan serasi, tetapi tidak serupa, jenis - tingkah laku kontravarian - telah bertemu dengan cabaran. Mari kita mendalami secara spesifik untuk memahami sebabnya.
Pertimbangkan definisi fungsi berikut:
func Pipe[A, T1, T2 any](left func(A) T1, right func(T1) T2) func(A) T2 { return func(a A) T2 { return right(left(a)) } }
Fungsi ini bertujuan untuk memaipkan output fungsi kiri ke dalam fungsi yang betul, pengiraan rantai. Walau bagaimanapun, apabila cuba menggunakannya dengan contoh berikut:
func OpenFile(name string) *os.File { ... } func ReadAll(rdr io.Reader) []byte { ... } var OpenRead = Pipe(OpenFile, ReadAll)
kompilasi gagal. Ini kerana pengkompil menjangkakan T1 adalah sama dengan *os.File, walaupun ia serasi dengan io.Reader. Walaupun nampaknya munasabah untuk mengharapkan jenis yang serasi diterima, ini tidak berlaku kerana kekurangan sokongan Go untuk jenis hasil kovarian.
Adakah terdapat cara untuk membetulkan tandatangan ini dalam Go 1.18?
Malangnya, tidak. Generik Go pada masa ini tidak mempunyai keupayaan untuk menyatakan kebolehtukaran jenis menggunakan parameter jenis, menjadikannya mustahil untuk mengubah suai fungsi Paip untuk membenarkan kelakuan ini.
Adakah ini pepijat dalam Go 1.18?
Tidak. Seperti yang dinyatakan dalam Soalan Lazim rasmi, tingkah laku ini adalah disengajakan dan tidak dianggap sebagai pepijat.
Penyelesaian
Untuk mencapai hasil yang serupa, seseorang boleh melaksanakan langkah penukaran secara manual:
func Pipe[A, T1, T2, T3 any](left func(A) T1, right func(T2) T3) func(A) T3 { return func(a A) T3 { return right(any(left(a)).(T2)) } }
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa pendekatan ini tidak menyediakan jenis masa kompilasi keselamatan.
Atas ialah kandungan terperinci Bolehkah Go 1.18 Generics Mengendalikan Jenis Kontravarian dalam Tandatangan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!