Dévoilement des itérations génériques sur les Union Slices (Résolution "T n'a pas de type de noyau")
L'exploration des génériques de Go se poursuit, cette fois en explorant dans un défi intrigant : itérer sur une union de tranches. Notre objectif est de créer une fonction générique capable de gérer à la fois des tranches d'entiers et des tranches de flottants, puis de résumer leur contenu.
Notre tentative initiale a rencontré un obstacle :
type NumberSlice interface { []int64 | []float64 } func add[N NumberSlice](n N) { for _, v := range n { fmt.Println(v) } }
Nous avons reçu le erreur "ne peut pas dépasser n (variable de type N contrainte par NumberSlice) (N n'a pas de type de base)." Cette erreur provient de l'absence de type de noyau pour la contrainte d'interface générique.
Comprendre les types de noyau est crucial. Un type de base existe lorsque l'ensemble de types d'une interface a un seul type sous-jacent ou se compose uniquement de types de canaux avec un type d'élément identique et de canaux directionnels avec la même direction. Malheureusement, notre contrainte d'interface ne satisfait pas ces conditions en raison de ses deux types sous-jacents, []int64 et []float64.
Pour résoudre ce problème, nous pouvons redéfinir notre interface pour exiger les types de base et passer une tranche du type de base comme argument de fonction :
type Number interface { int64 | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
Alternativement, nous pouvons utiliser une approche plus verbeuse avec un type NumberSlice spécialisé paramètre :
type NumberSlice[N int64 | float64] interface { ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
En utilisant ces techniques, nous pouvons parcourir efficacement les tranches d'union et effectuer les opérations souhaitées dans nos fonctions génériques.
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!