Rumah >pembangunan bahagian belakang >Golang >Bolehkah Contravariance Menyelesaikan Isu Keserasian Jenis Generik 1.18 dalam Fungsi Paip?
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)
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)) } }
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!