首頁  >  文章  >  後端開發  >  為什麼當函數傳回一個函數時 Go 泛型會失敗?

為什麼當函數傳回一個函數時 Go 泛型會失敗?

王林
王林轉載
2024-02-05 21:33:11435瀏覽

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

問題內容

我剛開始在 go 上嘗試泛型,但遇到了一種我不完全理解它失敗原因的情況。

我重構了以下函數:

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

進入此:

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

此函數的單元測試失敗並出現錯誤:tests/utils/numberutils_test.go:82:50: 無法推斷 t 。來源為:

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

我已經將類似的函數從 int 更改為泛型,我不確定為什麼這個函數特別不起作用。我認為它可能與返回另一個函數的函數有某種關係,但我無法確切地弄清楚為什麼。謝謝。


正確答案


通常,答案就在類型參數提案

唯一可以推斷的類型參數是那些用於函數(非類型)輸入參數類型的參數。如果有一些類型參數僅用於函數的結果參數類型,或僅用於函數體,則無法使用函數參數類型推斷來推斷這些類型參數。

如果是

func PositivePercentageAbove[T constraints.Integer](above int) func(list []T) bool

由於型別參數t沒有出現在參數清單中,因此無法推論對應的型別參數。

以上是為什麼當函數傳回一個函數時 Go 泛型會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除