Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mencapai Kekangan Jenis Rekursif dalam Go Generics?
Kekangan Jenis Rekursif dengan Jenis Pratakrif
Dalam Go generik, adalah mungkin untuk menentukan kekangan jenis pada jenis generik menggunakan antara muka. Walau bagaimanapun, ia boleh mencabar untuk menentukan kekangan yang memerlukan pelaksanaan kaedah dengan hujah jenis generik itu sendiri.
Draf generik Go semasa tidak membenarkan kekangan jenis rekursif, menjadikannya mustahil untuk mencapai tingkah laku yang diingini. Sebagai contoh, pertimbangkan antara muka berikut:
type Lesser interface { Less(rhs Lesser) bool }
Kami boleh melaksanakan antara muka ini untuk jenis tersuai, seperti Int:
type Int int func (lhs Int) Less(rhs Int) bool { return lhs < rhs }
Walau bagaimanapun, kod berikut akan gagal untuk disusun kerana Int tidak memenuhi antara muka Lesser:
func IsLess[T Lesser](lhs, rhs T) bool { return lhs.Less(rhs) } func main() { IsLess[Int](Int(10), Int(20)) }
Penyelesaian untuk pengehadan ini ialah dengan mentakrifkan antara muka generik yang merujuk dirinya sebagai parameter jenis:
type Lesser[T any] interface { Less(T) bool }
Antara muka ini menentukan bahawa mana-mana jenis yang melaksanakan antara muka Lesser mesti mempunyai Kurang kaedah yang mengambil hujah daripada jenis yang sama.
Kita kemudian boleh mentakrifkan fungsi IsLess menggunakan generik ini antara muka:
func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
Sekarang, kami boleh melaksanakan jenis tersuai yang memenuhi kekangan Lebih Kecil:
type Apple int func (a Apple) Less(other Apple) bool { return a < other } type Orange int func (o Orange) Less(other Orange) bool { return o < other }
Menggunakan fungsi IsLess dengan jenis tersuai ini akan menghasilkan tingkah laku yang betul:
func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Orange(30), Orange(15))) // false }
Penyelesaian ini berkesan menguatkuasakan kekangan jenis rekursif dengan memerlukan pelaksanaan kaedah dengan hujah generik taip.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Kekangan Jenis Rekursif dalam Go Generics?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!