Rumah > pembangunan bahagian belakang > Golang > Bolehkah Contravariance Menyelesaikan Isu Keserasian Jenis Generik 1.18 dalam Fungsi Paip?

Bolehkah Contravariance Menyelesaikan Isu Keserasian Jenis Generik 1.18 dalam Fungsi Paip?

Linda Hamilton
Lepaskan: 2024-11-24 07:47:11
asal
432 orang telah melayarinya

Can Contravariance Solve Go 1.18's Generic Type Compatibility Issue in the Pipe Function?

Jenis Kontravarian dalam Go 1.18 Generik

Dalam Go 1.18, jenis generik membenarkan untuk mentakrifkan fungsi dengan jenis yang berbeza-beza bergantung pada jenis argumen. Contravariance, jenis varians tertentu, membolehkan fungsi menerima julat jenis input yang lebih luas sambil mengekalkan hubungan yang jelas antara jenis input dan output.

Fungsi Paip

Fungsi Paip yang disediakan bertujuan untuk mengarang fungsi yang mengubah nilai. Ia menjangkakan jenis output fungsi kiri sepadan dengan jenis input fungsi kanan. Walau bagaimanapun, dalam contoh berikut, ia gagal untuk menyusun:

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))
    }
}

func OpenFile(name string) *os.File {
    ...
}

func ReadAll(rdr io.Reader) []byte {
    ...
}

var OpenRead = Pipe(OpenFile, ReadAll)
Salin selepas log masuk

Pengkompil mengadu kerana T1 dianggap sebagai *os.Fail walaupun ia serasi dengan io.Reader.

Adakah Penyelesaian?

Malangnya, tiada jalan dalam Go 1.18 generik untuk mengubah suai tandatangan Paip untuk membolehkan tingkah laku yang diingini. Go tidak menyokong jenis hasil kovarian, bermakna jenis output fungsi tidak boleh berbeza-beza berdasarkan jenis input.

Adakah ia Pepijat?

Gelagat dalam Pergi 1.18 bukan pepijat. Ia adalah dengan reka bentuk, seperti yang dijelaskan dalam Soalan Lazim untuk generik Go.

Penyelesaian

Untuk menangani had ini, versi diubah suai fungsi Paip boleh digunakan, tetapi ia mengorbankan keselamatan jenis masa kompilasi:

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

Atas ialah kandungan terperinci Bolehkah Contravariance Menyelesaikan Isu Keserasian Jenis Generik 1.18 dalam Fungsi Paip?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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