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.
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) }
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
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) }
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].
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 }
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!