Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-06 08:50:08360parcourir

如何迭代通用函数中传递的切片并集? (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)
}

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 ?


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)
    }
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer