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