Rumah >pembangunan bahagian belakang >Golang >Mengapa Parameter Jenis Generik My Go Tidak Memuaskan Antara Muka `stringer`?

Mengapa Parameter Jenis Generik My Go Tidak Memuaskan Antara Muka `stringer`?

Susan Sarandon
Susan Sarandonasal
2024-12-25 11:10:13480semak imbas

Why Doesn't My Go Generic Type Parameter Satisfy the `stringer` Interface?

Memahami Kekangan Jenis Generik dalam Go

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.

Masalahnya

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)

Memahami Ralat

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

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.

Kesimpulan

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!

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