Ich habe gerade angefangen, unterwegs mit Generika zu experimentieren, und bin in eine Situation geraten, in der ich nicht ganz verstehe, warum es fehlgeschlagen ist.
Ich habe die folgende Funktion überarbeitet:
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) } }
Hier eingeben:
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) } }
Der Komponententest für diese Funktion schlägt mit folgendem Fehler fehl: tests/utils/numberutils_test.go:82:50: 无法推断 t
. Quelle:
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) } } }
Ich habe eine ähnliche Funktion von „int“ in „generic“ geändert und bin mir nicht sicher, warum gerade diese Funktion nicht funktioniert. Ich denke, es könnte etwas damit zu tun haben, dass die Funktion eine andere Funktion zurückgibt, aber ich kann nicht genau herausfinden, warum. Danke.
Normalerweise liegt die Antwort im Typparametervorschlag:
Die einzigen Typparameter, die abgeleitet werden können, sind diejenigen, die für Funktions-(Nicht-Typ-)Eingabeparametertypen verwendet werden. Wenn es Typparameter gibt, die nur für den Ergebnisparametertyp der Funktion oder nur für den Funktionskörper verwendet werden, können Sie die Funktionsparametertypinferenz nicht verwenden, um diese Typparameter abzuleiten.
Wenn ja
func PositivePercentageAbove[T constraints.Integer](above int) func(list []T) bool
Da der Typparameter t
nicht in der Parameterliste erscheint, kann der entsprechende Typparameter nicht abgeleitet werden.
Das obige ist der detaillierte Inhalt vonWarum schlagen Go-Generika fehl, wenn eine Funktion eine Funktion zurückgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!