Maison > Article > développement back-end > Comment parcourir l'union des tranches passées dans une fonction générique ? (Type sans noyau T)
Je teste des génériques dans Go 1.18 et j'ai regardé cet exemple. Je veux recréer cet exemple mais pouvoir passer une tranche int ou une tranche flottante et dans la fonction je résumerai tout dans la tranche.
C'est à ce moment-là que j'ai rencontré des problèmes en parcourant les tranches. Voici ce que j'ai essayé :
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) }
J'obtiens l'erreur :
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
Comment puis-je atteindre cet objectif ?
Le type de base d'une interface (y compris les contraintes d'interface) est défini comme suit :
Une interface t a un type de noyau si l'une des conditions suivantes est remplie : Satisfait :
Il existe un seul typeu
, qui est le type sous-jacent de tous les types dans l'ensemble de types t
Ou l'ensemble de types de t contient uniquement des types de canaux avec le même type d'élément e, et tous les canaux dirigés ont la même direction.
Votre contrainte d'interface n'a pas de type principal car elle a deux types sous-jacents : []int64
和 []float64
.
Vous ne pouvez donc pas l'utiliser lorsqu'un type de base est requis. Surtout range
和 make
.
Vous pouvez modifier l'interface pour exiger le type de base puis spécifier la tranche dans la signature de la fonction :
// 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) } }
Cela fonctionne également, mais est plus détaillé :
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) } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!