Rumah >pembangunan bahagian belakang >Golang >Mengapakah Saya Tidak Boleh Menggunakan Pembolehubah Jenis `*T` sebagai `Stringer` dalam Go Generics?

Mengapakah Saya Tidak Boleh Menggunakan Pembolehubah Jenis `*T` sebagai `Stringer` dalam Go Generics?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-13 01:58:10919semak imbas

Why Can't I Use a `*T` Type Variable as a `Stringer` in Go Generics?

Memahami Ralat "Tidak Boleh Menggunakan Pembolehubah Jenis *T sebagai Jenis Stringer dalam Argumen" dalam Go Generics

Dalam coretan kod yang disediakan, anda cuba untuk menggunakan fungsi lakukan secara umum yang menjangkakan parameter jenis rentetan, tetapi anda lulus penunjuk kepada parameter jenis T sebaliknya.

Pengkompil Go menimbulkan ralat kerana:

  • Jenis Identiti dan Parameter: T secara semula jadi tidak bersamaan dengannya kekangan FooBar. Oleh itu, *T tidak sama dengan *FooBar atau *bar.
  • Kaedah Hilang: Antara muka rentetan memerlukan kaedah bernama a(). Pada masa ini, jenis foo dan bar anda melaksanakan kaedah ini pada penerima penunjuk, tetapi *T tidak mempunyai kaedah ini secara semulajadi.

Membetulkan Isu

Terdapat dua pendekatan utama untuk menyelesaikan isu ini:

1. Tegaskan Keselamatan Jenis dengan Penegasan Jenis (Kurang Optimum)

  • Tegaskan bahawa *T melaksanakan rentetan menggunakan sebarang(t).(stringer) dalam fungsi do.
  • Pendekatan ini boleh menyebabkan panik jika T tidak benar-benar melaksanakan stringer.

2. Tentukan Semula Kekangan dan Peribadikan Generik (Diutamakan)

  • Tambah rentetan sebagai kekangan pada antara muka FooBar.
  • Gunakan penerima penuding untuk jenis foo dan bar untuk diselaraskan dengan kekangan .
  • Perkenalkan parameter jenis kedua yang menentukan kekangan dalam Antara muka FooBar.
  • Lepaskan contoh jenis terkurung sebagai hujah kepada blah.

Kod Disemak:

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar[T]]() {
    var t T
    do(U(&t))
}

func main() {
    blah[foo]()
}

Dalam kod yang disemak ini:

  • Antara muka FooBar termasuk rentetan sebagai kekangan.
  • Jenis foo dan bar mempunyai penerima penunjuk untuk kaedah a() mereka.
  • U dikekang oleh FooBar[T], memastikan ia memenuhi kedua-dua kekangan FooBar dan stringer.
  • bla mengambil hujah jenis U, yang merupakan contoh FooBar yang dikekang antara muka.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menggunakan Pembolehubah Jenis `*T` sebagai `Stringer` 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