Bolehkah Go 1.18 Generics Mengendalikan Jenis Kontravarian dalam Tandatangan Fungsi?

Susan Sarandon
Lepaskan: 2024-11-17 10:50:02
asal
1002 orang telah melayarinya

Can Go 1.18 Generics Handle Contravariant Types in Function Signatures?

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

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

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

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!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan