Warum schlagen Go-Generika fehl, wenn eine Funktion eine Funktion zurückgibt?

王林
Freigeben: 2024-02-05 21:33:11
nach vorne
492 Leute haben es durchsucht

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

Frageninhalt

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)
    }
}
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

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)
        }
    }
}
Nach dem Login kopieren

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.


Richtige Antwort


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
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage