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
Linda Hamiltonasal
2024-12-20 15:22:10841semak imbas

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]()
}

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!

Kenyataan:
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