我刚刚开始在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 体原因.谢谢.

推荐答案

和往常一样,答案就在这Type Parameters proposal条中:

唯一可以推断的类型参数是用于函数(非类型)输入参数的类型的参数.如果有一些类型参数仅用于函数的结果参数类型,或仅在函数体中使用,则无法使用函数实参类型推断来推断这些类型实参.

在.的情况下

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

由于类型参数T未出现在参数列表中,因此无法推断对应的类型参数.

Go相关问答推荐

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

编辑时保留YAML文件中的单引号

如何使用中间件更改http请求的响应代码?

Kafka golang 生产者在错误后更改分区计数

在 Go 中将元数据从一个 JPEG 复制到另一个

如何使用gosdk在Dynamodb中进行UpdateItem时,将ValueBuilder对象声明为StringSet类型?

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

有没有办法计算枚举中定义的项目总数?

Golang代码判断第一个词是否可以从第二个词形成

从Go中的随机日期开始以天为单位获取时间

数据流中的无根单元错误,从 Golang 中的 PubSub 到 Bigquery

为什么在单独的 go routine 中需要 wg.Wait() 和 close() ?

如何使用 Status 字段创建 Kubernetes 对象?

在 Go 中读取数字行

我如何解码 aes-256-cfb

即使一个测试用例失败,如何运行所有测试用例

Go 中 SDL Surface 的 OpenGL 纹理

为什么我不能使用来自 gocloak 中 Login() 的访问令牌在 KeyCloak 中创建新客户端?

使用 xml.Name 将 xml 解组为 [] struct

为什么 Go 不允许将一个泛型分配给另一个泛型?