Menyingkap Lelaran Generik ke atas Kepingan Kesatuan (Menyelesaikan "T tidak mempunyai jenis teras")
Penerokaan generik Go diteruskan, kali ini menyelidiki menjadi cabaran yang menarik: mengulangi gabungan kepingan. Matlamat kami adalah untuk mencipta fungsi generik yang boleh mengendalikan kedua-dua hirisan integer dan hirisan apungan, kemudian jumlah kandungannya.
Percubaan awal kami menghadapi halangan:
type NumberSlice interface { []int64 | []float64 } func add[N NumberSlice](n N) { for _, v := range n { fmt.Println(v) } }
Kami menerima ralat "tidak boleh berjulat melebihi n (pembolehubah jenis N dikekang oleh NumberSlice) (N tidak mempunyai jenis teras)." Ralat ini berpunca daripada kekurangan jenis teras untuk kekangan antara muka generik.
Memahami jenis teras adalah penting. Jenis teras wujud apabila set jenis antara muka mempunyai satu jenis asas atau hanya terdiri daripada jenis saluran dengan jenis elemen yang sama dan saluran arah dengan arah yang sama. Malangnya, kekangan antara muka kami tidak memenuhi syarat ini kerana dua jenis asasnya, []int64 dan []float64.
Untuk menyelesaikan isu ini, kami boleh mentakrifkan semula antara muka kami untuk memerlukan jenis asas dan lulus hirisan jenis asas sebagai hujah fungsi:
type Number interface { int64 | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
Sebagai alternatif, kita boleh menggunakan pendekatan yang lebih verbose dengan jenis NumberSlice khusus parameter:
type NumberSlice[N int64 | float64] interface { ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
Dengan menggunakan teknik ini, kami boleh mengulangi hirisan kesatuan dengan berkesan dan melaksanakan operasi yang diingini dalam fungsi generik kami.
Atas ialah kandungan terperinci Bagaimana untuk Mengulangi Kepingan Kesatuan dalam Go Generics dan Menyelesaikan Ralat 'T tidak mempunyai jenis teras'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!