Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk mengulangi penyatuan kepingan yang diluluskan dalam fungsi generik? (Jenis tanpa teras T)
Saya sedang menguji generik dalam go 1.18 dan melihat contoh ini. Saya ingin mencipta semula contoh itu tetapi boleh lulus dalam kepingan int atau kepingan apungan dan dalam fungsi saya akan menjumlahkan segala-galanya dalam kepingan.
Ini adalah apabila saya menghadapi beberapa isu semasa mengulangi bahagian tersebut. Inilah yang saya cuba:
package main import "fmt" // numberslice constraint type numberslice interface { []int64 | []float64 } func add[n numberslice](n n) { // want: to range over n and print value of v for _, v := range n { fmt.println(v) } } func main() { ints := []int64{1, 2} add(ints) }
Saya mendapat ralat:
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
Bagaimana saya mencapai matlamat ini?
jenis teras antara muka (termasuk kekangan antara muka) ditakrifkan seperti berikut:
Antara muka t mempunyai jenis teras jika salah satu daripada syarat berikut dipenuhi: Puas hati:
Terdapat satu jenisu
, iaitu jenis asas semua jenis dalam set jenis t
Atau set jenis t mengandungi hanya jenis saluran dengan jenis elemen yang sama e, dan semua saluran terarah mempunyai arah yang sama.
Kekangan antara muka anda tidak mempunyai jenis teras kerana ia mempunyai dua jenis asas: []int64
和 []float64
.
Jadi anda tidak boleh menggunakannya di mana jenis teras diperlukan. Terutama sekali range
和 make
.
Anda boleh menukar antara muka untuk memerlukan jenis primitif dan kemudian nyatakan kepingan dalam tandatangan fungsi:
// still no core type... type number interface { int64 | float64 } // ...but the argument will be instantiated with either int64 or float64 func add[n number](n []n) { for _, v := range n { fmt.println(v) } }
Ini juga berfungsi, tetapi lebih bertele-tele:
type NumberSlice[N int64 | float64] interface { // one core type []N ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
Atas ialah kandungan terperinci Bagaimana untuk mengulangi penyatuan kepingan yang diluluskan dalam fungsi generik? (Jenis tanpa teras T). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!