我剛開始在 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中文網其他相關文章!