Mengurus IncompatibleAssignError dalam Jenis Generik dengan Kekangan Nilai Campuran
Dalam Go, generik membenarkan penciptaan jenis dengan kekangan khusus pada medan mereka. Walau bagaimanapun, memberikan literal nilai kepada medan struct boleh membawa kepada ralat IncompatibleAssign apabila mencampurkan kumpulan jenis berbeza dalam kekangan.
Pertimbangkan contoh ini:
type constraint interface { ~float32 | ~float64 } type foo[T constraint] struct { val T } func (f *foo[float64]) setValToPi() { f.val = 3.14 }
Kod ini memberikan literal 3.14 kepada val medan jenis foo[float64]. Ini boleh diterima kerana 3.14 ialah nilai float64 yang sah.
Walau bagaimanapun, ralat timbul apabila kekangan dilanjutkan untuk memasukkan jenis int:
type constraint interface { ~float32 | ~float64 | ~int } type foo[T constraint] struct { val T } func (f *foo[float64]) setValToPi() { f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment }
Ralat ini berasal daripada pengisytiharan kaedah:
func (f *foo[float64]) setValToPi() { // ... }
Di sini, float64 dianggap sebagai nama parameter jenis dan bukannya kekangan yang dimaksudkan. Akibatnya, pengkompil tidak dapat menentukan jenis medan val tertentu dan tidak boleh mengesahkan bahawa 3.14 serasi dengan semua kemungkinan kekangan kejadian.
Untuk menyelesaikannya, adalah penting untuk menggunakan parameter kaedah generik untuk menerima nilai sebaliknya jenis parameter jenis:
func (f *foo[T]) SetValue(val T) { f.val = val }
Penyelesaian ini menghalang pemberian nilai tetap seperti 3.14, yang merupakan amalan yang tidak sesuai dalam konteks ini. Pendekatan alternatif melibatkan penggunaan mana-mana/antara muka{} sebagai jenis medan.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat IncompatibleAssign Apabila Menggunakan Kekangan Jenis Campuran dalam Go Generics?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!