Maison > développement back-end > Golang > le corps du texte

Pourquoi les génériques Go échouent-ils lorsqu'une fonction renvoie une fonction ?

王林
Libérer: 2024-02-05 21:33:11
avant
491 Les gens l'ont consulté

为什么当函数返回一个函数时 Go 泛型会失败?

Contenu de la question

Je viens de commencer à expérimenter des génériques en déplacement et je me suis retrouvé dans une situation où je ne comprends pas vraiment pourquoi cela a échoué.

J'ai refactorisé la fonction suivante :

func positivepercentageabove(above int) func(list []uint8) bool {
    return func(list []uint8) bool {
        acum := 0
        for _, x := range list {
            acum += int(x)
        }
        return (float64(acum) / float64(len(list)) * 100) >= float64(above)
    }
}
Copier après la connexion

Entrez ici :

func positivepercentageabove[t constraints.integer](above int) func(list []t) bool {
    return func(list []t) bool {
        acum := 0
        for _, x := range list {
            acum += int(x)
        }
        return (float64(acum) / float64(len(list)) * 100) >= float64(above)
    }
}
Copier après la connexion

Le test unitaire de cette fonction échoue avec l'erreur : tests/utils/numberutils_test.go:82:50: 无法推断 t . Source :

func Test_TruePercentageAbove(t *testing.T) {
    tables := []struct {
        percentage int
        list       []uint8
        output     bool
    }{
        {percentage: 100, list: []uint8{1, 1, 1, 1}, output: true},
        {percentage: 100, list: []uint8{1, 1, 0, 1}, output: false},
        {percentage: 80, list: []uint8{1, 1, 1, 1, 0}, output: true},
        {percentage: 90, list: []uint8{1, 1, 1, 1, 0}, output: false},
        {percentage: 100, list: []uint8{1, 1, 1, 1, 0}, output: false},
        {percentage: 40, list: []uint8{0, 1, 0, 1, 0, 1}, output: true},
        {percentage: 60, list: []uint8{0, 1, 0, 1, 0, 1}, output: false},
        {percentage: 70, list: []uint8{0, 1, 0, 1, 0, 1}, output: false},
    }

    for _, table := range tables {
        result := utils.PositivePercentageAbove(table.percentage)(table.list)

        if result != table.output {
            t.Errorf("Slice %v with percentage above %v expected to return %v but returned %v", table.list, table.percentage, table.output, result)
        }
    }
}
Copier après la connexion

J'ai changé une fonction similaire de int à générique et je ne sais pas pourquoi celle-ci ne fonctionne pas spécifiquement. Je pense que cela pourrait avoir quelque chose à voir avec le fait que la fonction renvoie une autre fonction, mais je n'arrive pas à comprendre exactement pourquoi. Merci.


Réponse correcte


Habituellement, la réponse réside dans la Proposition de paramètres de type :

Les seuls paramètres de type qui peuvent être déduits sont ceux utilisés pour les types de paramètres d'entrée de fonction (non-type). Si certains paramètres de type sont utilisés uniquement pour le type de paramètre de résultat de la fonction, ou uniquement pour le corps de la fonction, vous ne pouvez pas utiliser l'inférence de type de paramètre de fonction pour déduire ces paramètres de type.

Si oui

func PositivePercentageAbove[T constraints.Integer](above int) func(list []T) bool
Copier après la connexion

Étant donné que le paramètre de type t n'apparaît pas dans la liste des paramètres, le paramètre de type correspondant ne peut pas être déduit.

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