Kaedah Memanggil tentang Kekangan Kesatuan dalam Go Generik
Dalam Go generik (v1.18), anda boleh menghadapi jenis kekangan kesatuan yang mengehadkan jenis parameter kepada jenis yang melaksanakan antara muka bersatu. Walau bagaimanapun, ketidakupayaan untuk memanggil kaedah dikongsi antara jenis yang dikekang menimbulkan kebimbangan tentang kegunaan kekangan tersebut.
Pertimbangkan kod berikut:
type A struct {} type B struct {} type AB interface { *A | *B } func (a *A) some() bool { return true } func (b *B) some() bool { return false } func some[T AB](x T) bool { return x.some() } // Compiler error
Ralat pengkompil "x.some undefined" adalah disebabkan oleh fakta bahawa kekangan kesatuan jenis *A | *B tidak menjamin kewujudan beberapa kaedah pada kedua-dua *A dan *B.
Untuk menyelesaikan isu ini, anda boleh menambah kaedah pada kekangan antara muka:
type AB interface { *A | *B; some() bool } func some[T AB](x T) bool { return x.some() } // Works
Ini mengehadkan T kepada jenis yang melaksanakan kedua-dua *A atau *B dan mengisytiharkan beberapa kaedah.
Walau bagaimanapun, penyelesaian ini dilihat sebagai penyelesaian untuk perkara yang sesuai dengan jenis kesatuan sekerja sahaja. Go 1.18 pada masa ini mempunyai had di mana pengkompil menyokong memanggil kaedah pada nilai parameter jenis P hanya jika kaedah m diisytiharkan secara eksplisit oleh antara muka kekangan P. Walaupun spesifikasi bahasa menyatakan bahawa set kaedah antara muka ialah persilangan set kaedah bagi setiap jenis dalam set jenis antara muka. Isu ini dijangka akan ditangani dalam Go 1.19.
Atas ialah kandungan terperinci Bolehkah Go Generics' Union Constraints Memanggil Kaedah Dikongsi Tanpa Pengisytiharan Antara Muka Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!