我刚刚开始在Go上try 泛型,我遇到了一种情况,我不完全理解它为什么会失败.
我重构了以下函数,如下所示:
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: cannot infer 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改为泛型,我不确定为什么这个函数特别不起作用.我认为这可能与返回另一个函数的函数有关,但我不知props 体原因.谢谢.