Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Golang 1.18 Generik Tidak Menyokong Kovarian Sepenuhnya?

Mengapa Golang 1.18 Generik Tidak Menyokong Kovarian Sepenuhnya?

Susan Sarandon
Susan Sarandonasal
2024-11-17 18:06:02130semak imbas

Why Doesn't Golang 1.18 Generics Fully Support Covariance?

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:

  • kiri: Menerima hujah jenis A dan mengembalikan nilai jenis T1.
  • kanan: Menerima hujah jenis T1 dan mengembalikan nilai jenis T2.

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!

Kenyataan:
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