Rumah >pembangunan bahagian belakang >Golang >Mengapa Parameter Jenis Generik My Go Tidak Memuaskan Antara Muka `stringer`?
Dalam Go 1.18, generik menawarkan alat yang berkuasa untuk meningkatkan fleksibiliti kod. Walau bagaimanapun, apabila bekerja dengan kekangan jenis, adalah penting untuk memahami sebab ralat tertentu boleh berlaku.
Pertimbangkan kod berikut:
type stringer interface { a() string } func do(s stringer) { fmt.Println(s.a()) } func blah[T FooBar]() { t := &T{} do(t) } func main() { blah[foo]() }
Apabila cuba menyusun kod ini, anda mungkin menghadapi ralat:
cannot use t (variable of type *T) as type stringer in argument to do: *T does not implement stringer (type *T is pointer to type parameter, not type parameter)
Ralat ini berpunca daripada salah faham tentang cara kekangan jenis generik berfungsi. FooBar kekangan dalam fungsi blah ialah pemegang tempat untuk jenis yang memenuhi antara muka FooBar. Walau bagaimanapun, pembolehubah t adalah jenis T, yang merupakan penunjuk kepada parameter jenis T. Ini bermakna T bukan parameter jenis itu sendiri, dan oleh itu ia tidak dapat memenuhi antara muka rentetan.
Penyelesaian kepada isu ini adalah dengan memperkenalkan hubungan antara parameter jenis T dan antara muka rentetan. Terdapat dua pendekatan yang berpotensi:
1. Penegasan Eksplisit
Anda boleh menegaskan secara eksplisit bahawa *T memenuhi antara muka rentetan menggunakan sebarang penukaran jenis:
func blah[T FooBar]() { t := &T{} do(any(t).(stringer)) }
2. Komposisi Jenis
Sebagai alternatif, anda boleh menentukan jenis baharu yang menggabungkan kekangan FooBar dan stringer:
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar[T]]() { var t T do(U(&t)) }
Pendekatan ini memastikan keselamatan jenis dengan memasukkan stringer ke dalam antara muka FooBar dan memerlukan T menjadi jenis penunjuk untuk memenuhi kekangan FooBar.
Memahami hubungan antara kekangan jenis dan parameter jenis adalah penting untuk bekerja secara berkesan dengan generik dalam Go. Dengan memperkenalkan hubungan antara T dan stringer, sama ada melalui penegasan eksplisit atau gubahan jenis, anda boleh menyelesaikan ralat dan mendayakan gelagat yang diingini.
Atas ialah kandungan terperinci Mengapa Parameter Jenis Generik My Go Tidak Memuaskan Antara Muka `stringer`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!