Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menyelesaikan Ralat 'tidak boleh menggunakan pembolehubah jenis *T sebagai rentetan jenis' dalam Go Generics?

Bagaimanakah Saya Boleh Menyelesaikan Ralat 'tidak boleh menggunakan pembolehubah jenis *T sebagai rentetan jenis' dalam Go Generics?

Linda Hamilton
Lepaskan: 2024-12-20 15:22:10
asal
990 orang telah melayarinya

How Can I Resolve the

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:

  1. Perkenalkan antara muka rentetan pada FooBar: Tambahkan rentetan pada FooBar kekangan, membenarkan semua jenis yang memenuhi FooBar mempunyai kaedah rentetan.
  2. Tukar jenis dalam kesatuan: Ubah suai kekangan FooBar untuk menerima penunjuk kepada foo atau bar, sebagai jenis penerima stringer ialah penunjuk.
  3. Isytiharkan tersurat komposit sebagai penunjuk: Memandangkan anda tidak boleh mengisytiharkan literal komposit pada kekangan tanpa jenis teras, anda perlu mengisytiharkan t sebagai jenis penunjuk.
  4. Perkenalkan parameter jenis untuk FooBar: Ekstrak gabungan jenis daripada FooBar ke dalam parameter jenis baharu untuk memastikan U dan T mempunyai jenis yang serasi set.

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]()
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

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