Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menyelesaikan Ralat 'tidak boleh menggunakan pembolehubah jenis *T sebagai rentetan jenis' dalam Go Generics?
Jenis Pertimbangan Keselamatan dalam Generik
Dalam generik Go, parameter jenis T adalah berbeza daripada antara muka kekangan FooBar. Walau bagaimanapun, perbezaan ini menimbulkan persoalan: bagaimana anda boleh menghantar contoh T kepada fungsi yang mengharapkan jenis yang melaksanakan rentetan (seperti lakukan)?
Memahami Ralat
Mesej ralat "tidak boleh menggunakan pemboleh ubah jenis *T sebagai rentetan jenis dalam hujah untuk dilakukan" menunjukkan bahawa parameter t blah telah salah dikenal pasti sebagai jenis yang melaksanakan stringer. Walau bagaimanapun, T secara semulajadinya tidak memiliki kaedah ini.
Menyelesaikan Isu
Untuk membolehkan penukaran t kepada rentetan, langkah berikut diperlukan:
Kod Akhir
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar]() { var t T do(U(&t)) } func main() { blah[foo]() }
Penjelasan
Sekarang, apabila blah dipanggil, pembolehubah t jenis T diisytiharkan sebagai penunjuk. FooBar[T] mengekang U menjadi jenis yang mengandungi penuding kepada T. Menukar &t kepada U adalah sah dan kaedah FooBar[T] (yang termasuk rentetan) tersedia untuk penerima t.
Nota:
Menggunakan parameter jenis untuk FooBar membenarkan untuk menghantar hujah dan menghilangkan keperluan untuk muslihat pertengahan. Sebagai contoh, anda boleh mengubah suai blah kepada:
func blah[T FooBar](t T) { do(t) }
Dan memanggilnya dengan blah(&foo{}).
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyelesaikan Ralat 'tidak boleh menggunakan pembolehubah jenis *T sebagai rentetan jenis' dalam Go Generics?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!