Maison > développement back-end > Golang > Comment parcourir les tranches d'union dans Go Generics et résoudre l'erreur « T n'a pas de type de noyau » ?

Comment parcourir les tranches d'union dans Go Generics et résoudre l'erreur « T n'a pas de type de noyau » ?

Barbara Streisand
Libérer: 2024-12-21 16:30:11
original
605 Les gens l'ont consulté

How to Iterate Over Union Slices in Go Generics and Solve the

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)
    }
}
Copier après la connexion

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)
    }
}
Copier après la connexion

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)
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal