Maison  >  Article  >  développement back-end  >  Pourquoi les génériques Go échouent-ils lorsqu'une fonction renvoie une fonction ?

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

王林
王林avant
2024-02-05 21:33:11435parcourir

为什么当函数返回一个函数时 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)
    }
}

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

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

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

É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!

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