Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mentakrifkan Kekangan Jenis Rekursif dalam Go Generik Menggunakan Antara Muka Tersuai?

Bagaimanakah Saya Boleh Mentakrifkan Kekangan Jenis Rekursif dalam Go Generik Menggunakan Antara Muka Tersuai?

Barbara Streisand
Lepaskan: 2025-01-04 09:28:34
asal
1014 orang telah melayarinya

How Can I Define Recursive Type Constraints in Go Generics Using Custom Interfaces?

Mentakrifkan Kekangan Jenis Rekursif dengan Antara Muka Tersuai

Dalam Go generik, kekangan jenis boleh ditakrifkan menggunakan antara muka. Walau bagaimanapun, draf standard tidak membenarkan kekangan jenis rekursif, di mana kaedah jenis mempunyai hujah jenis generik.

Senario Masalah

Pertimbangkan kod berikut yang mentakrifkan antara muka Lebih kecil dan fungsi IsLess:

type Lesser interface {
    Less(rhs Lesser) bool
}

func IsLess[T Lesser](lhs, rhs T) bool {
    return lhs.Less(rhs)
}
Salin selepas log masuk

Menjalankan kod ini mengakibatkan ralat:

Int does not satisfy Lesser: wrong method signature
    got  func (Int).Less(rhs Int) bool
    want func (Lesser).Less(rhs Lesser) bool
Salin selepas log masuk

Penyelesaian

Untuk menangani isu ini, kita boleh menentukan Antara muka Lesser dan IsLess berfungsi seperti berikut:

type Lesser[T any] interface {
    Less(T) bool
}

func IsLess[T Lesser[T]](x, y T) bool {
    return x.Less(y)
}
Salin selepas log masuk

Dalam takrifan ini, antara muka Lesser mengambil parameter jenis T dan mengisytiharkan kaedah Kurang yang menerima hujah jenis T. Fungsi IsLess mengekang jenis generik T untuk melaksanakan antara muka Lesser[T].

Contoh Penggunaan

Di sini adalah contoh penggunaan penyelesaian ini:

type Apple int

func (a Apple) Less(other Apple) bool {
    return a < other
}

func main() {
    fmt.Println(IsLess(Apple(10), Apple(20)))   // true
    fmt.Println(IsLess(Apple(20), Orange(30))) // compilation error: type mismatch
}
Salin selepas log masuk

Dalam hal ini contoh, jenis Apple memenuhi antara muka Lesser[Apple] kerana kaedah Lessnya menerima hujah jenis Apple. Fungsi IsLess kemudiannya boleh digunakan untuk membandingkan dua nilai Apple.

Pendekatan ini membenarkan kekangan jenis rekursif, membolehkan anda menguatkuasakan bahawa kaedah jenis mempunyai hujah daripada jenis generik.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mentakrifkan Kekangan Jenis Rekursif dalam Go Generik Menggunakan Antara Muka Tersuai?. 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