Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlagen Go-Generika fehl, wenn eine Funktion eine Funktion zurückgibt?

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

王林
王林nach vorne
2024-02-05 21:33:11481Durchsuche

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

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.


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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen