Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengelakkan Ralat IncompatibleAssign Apabila Menggunakan Kekangan Jenis Campuran dalam Go Generics?

Bagaimana untuk Mengelakkan Ralat IncompatibleAssign Apabila Menggunakan Kekangan Jenis Campuran dalam Go Generics?

Patricia Arquette
Lepaskan: 2024-12-28 10:21:10
asal
666 orang telah melayarinya

How to Avoid IncompatibleAssign Errors When Using Mixed Type Constraints in Go Generics?

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

Ralat ini berasal daripada pengisytiharan kaedah:

func (f *foo[float64]) setValToPi() {
    // ...
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan