Bagaimana Jenis Kontravarian Berfungsi dalam Go 1.18 Generik?

Linda Hamilton
Lepaskan: 2024-11-17 15:16:02
asal
972 orang telah melayarinya

How Do Contravariant Types Work in Go 1.18 Generics?

Jenis Kontravarian dalam Go 1.18 Generik

Dalam Go 1.18, pengenalan generik telah mencetuskan minat terhadap jenis kontravarian. Persoalan utama yang timbul ialah cara ia berfungsi dalam konteks generik.

Tingkah Laku Tidak Serasi: Jenis Tidak Serasi

Pertimbangkan coretan kod 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

Apabila cuba menggunakan Paip dengan fungsi berikut:

func OpenFile(name string) *os.File { ... }
func ReadAll(rdr io.Reader) []byte { ... }
Salin selepas log masuk

Kompilasi gagal kerana pengkompil menganggap T1 sebagai *os.Fail, yang tidak sama dengan io.Reader.

Punca Punca: Semantik Kontravarian

Isu ini berpunca daripada sifat jenis kontravarian. Dalam kes ini, T1 dijangka menjadi jenis yang lebih spesifik daripada A, bermakna fungsi yang menerima T1 juga boleh menerima A. Walau bagaimanapun, generik Go tidak menyokong jenis hasil kovarian. Oleh itu, Fungsi yang mengembalikan T1 tidak boleh mengembalikan A, walaupun ia boleh ditukar secara tersirat.

Resolusi dan Akibat

Pada masa ini tiada cara untuk mengubah suai tandatangan Pipe in Pergi 1.18 untuk membenarkan tingkah laku yang diingini. Ini tidak dianggap sebagai pepijat tetapi sebaliknya pilihan reka bentuk yang disengajakan.

Penyelesaian: Penukaran Jenis

Untuk memintas pengehadan ini, seseorang boleh menggunakan penukaran taip pada masa jalan:

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, pendekatan ini mengorbankan keselamatan jenis masa kompilasi.

Atas ialah kandungan terperinci Bagaimana Jenis Kontravarian Berfungsi dalam Go 1.18 Generik?. 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