Maison > développement back-end > Golang > Comment parcourir l'union des tranches passées dans une fonction générique ? (Type sans noyau T)

Comment parcourir l'union des tranches passées dans une fonction générique ? (Type sans noyau T)

WBOY
Libérer: 2024-02-06 08:50:08
avant
392 Les gens l'ont consulté

如何迭代通用函数中传递的切片并集? (T无芯型)

Contenu de la question

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

J'obtiens l'erreur :

cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
Copier après la connexion

Comment puis-je atteindre cet objectif ?


Bonne réponse


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 rangemake.

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

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

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:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal