Kovarian dalam Golang 1.18 Generik: Memahami Hadnya
Pengenalan generik Golang 1.18 membawa banyak kemajuan, tetapi batasan tertentu kekal, termasuk kekurangan kovarians lengkap sokongan.
Memahami Isu
Pertimbangkan senario di mana anda ingin mentakrifkan fungsi generik yang dipanggil Paip yang mengambil dua fungsi:
Matlamatnya ialah untuk mencipta fungsi yang melaksanakan output kiri sebagai input ke kanan . Walau bagaimanapun, pelaksanaan berikut gagal disusun dalam beberapa kes:
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)) } }
Isu ini timbul kerana generik Golang tidak menyokong kovarians sepenuhnya. Kovarians bermakna bahawa parameter jenis boleh digantikan dengan subjenis tanpa melanggar kontrak. Dalam kes ini, T1 tidak membenarkan subjenis manakala io.ReadCloser ialah subjenis io.Reader.
Keputusan Reka Bentuk Golang
Keputusan Golang untuk tidak melaksanakan kovarians sepenuhnya adalah berdasarkan pertimbangan keselamatan. Membenarkan kovarians boleh membawa kepada situasi di mana fungsi dipanggil dengan jenis yang tidak sepadan dengan tandatangan yang dimaksudkan, mengakibatkan tingkah laku yang tidak ditentukan.
Penjelasan Soalan Lazim
Soalan Lazim Golang menyatakan dengan jelas bahawa tingkah laku semasa adalah disengajakan dan bukan pepijat. Keputusan ini bertujuan untuk mengelakkan ralat masa jalan yang tidak dijangka yang boleh menjejaskan kebolehpercayaan aplikasi.
Jenis Boleh Tukar lwn. Jenis Kovarian
Walaupun Golang tidak menyokong kovarians penuh, ia membenarkan penukaran satu jenis kepada jenis yang lain. Walau bagaimanapun, dalam kes Paip func, tiada cara untuk mewakili penukaran ini menggunakan parameter jenis.
Sebagai alternatif, anda boleh secara eksplisit menghantar hasil kiri ke jenis yang diperlukan oleh kanan. Walau bagaimanapun, pendekatan ini tidak selamat jenis pada masa penyusunan, seperti yang ditunjukkan dalam kod yang diubah suai berikut:
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)) } }
Walaupun ini boleh menyelesaikan kerja, ia mengorbankan keselamatan masa kompilasi untuk penukaran masa jalan.
Atas ialah kandungan terperinci Mengapa Golang 1.18 Generik Tidak Menyokong Kovarian Sepenuhnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!