iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >为什么当函数返回一个函数时 Go 泛型会失败?
  • 314
分享到

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

2024-02-05 22:02:24 314人浏览 安东尼
摘要

问题内容 我刚刚开始在 Go 上尝试泛型,但遇到了一种我不完全理解它失败原因的情况。 我重构了以下函数: func positivepercentageabove(above int)

问题内容

我刚刚开始在 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 泛型会失败?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 为什么当函数返回一个函数时 Go 泛型会失败?

本文链接: https://www.lsjlt.com/news/561070.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么当函数返回一个函数时 Go 泛型会失败?
    问题内容 我刚刚开始在 go 上尝试泛型,但遇到了一种我不完全理解它失败原因的情况。 我重构了以下函数: func positivepercentageabove(above int)...
    99+
    2024-02-05
  • C++ 函数返回泛型类型时需要注意什么?
    在 c++++ 中返回泛型类型时,需要声明返回类型并使用 template 关键字。约束类型参数以确保符合特定要求,并可以返回泛型容器。谨慎使用泛型,尤其涉及算术运算时。 C++ 函数...
    99+
    2024-04-21
    c++ 泛型
  • Python函数为什么会默认返回None
    本篇内容主要讲解“Python函数为什么会默认返回None”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python函数为什么会默认返回None”吧!在正式开始之前,我们就用之前讨论过的 pas...
    99+
    2023-06-16
  • 当 MySQL LOCATE() 函数返回 NULL 作为输出时?
    当第一个参数(即子字符串)或第二个参数(即子字符串)的值为 NULL 时,它将返回 NULL 作为输出。下面的示例将演示它 - 示例mysql> Select LOCATE(NULL,'Ram is a good boy...
    99+
    2023-10-22
  • 当 go 中计时器完成时如何从函数返回?
    问题内容 我是刚开始开发玩具测验 cli 程序。我正在尝试实现一个计时器,以便当计时器结束时,测验就结束了。 这是我的初步实现。 func StartTimer(quizFinishe...
    99+
    2024-02-06
  • 为什么 Go 函数不能返回带有约束类型参数的类型?
    为什么Go函数不能返回带有约束类型参数的类型?这是一个经常引发疑惑的问题。在Go语言中,函数的返回类型不能是带有约束类型参数的类型,这主要是由于Go语言对泛型的支持较为有限所导致的。在...
    99+
    2024-02-09
    go语言
  • 所有 Go 函数都返回 err 作为第二个返回值吗?
    一分耕耘,一分收获!既然打开了这篇文章《所有 Go 函数都返回 err 作为第二个返回值吗?》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的...
    99+
    2024-04-05
  • python函数如何返回一个对象类型
    python使用range函数返回对象类型,具体方法如下:range函数语法:range(start, stop[, step])range函数使用方法:print(range(10))range(0,10)...
    99+
    2024-04-02
  • Golang 函数返回值与泛型编程的关系是什么?
    答案:函数返回值在泛型编程中允许泛型函数返回不同类型的具体值。类型参数化函数:声明语法为 func <type-parameters> function-name(<p...
    99+
    2024-04-13
    golang 泛型编程
  • 如果 INTERVAL() 函数的第一个参数为 NULL,MySQL 将返回什么?
    如果 INTERVAL() 函数的第一个参数为 NULL,MySQL 将返回 -1 作为输出。下面的例子将演示它 -mysql> Select INTERVAL(NULL,20,32,38,40,50,55); +----------...
    99+
    2023-10-22
  • C++ 函数返回枚举类型时有什么好处?
    使用枚举类型作为函数返回值的好处:提高可读性:使用有意义的名称常量,增强代码理解。类型安全性:确保返回值符合预期范围,避免意外行为。节省内存:枚举类型通常占用较少存储空间。易于扩展:可以...
    99+
    2024-04-20
    枚举 函数返回 c++ overflow
  • mysql中COALESCE函数为什么会失效
    mysql 中 coalesce 函数失效的原因是:参数全是 null参数类型不兼容传递 null 表达式次要错误 MySQL 中 COALESCE 函数失效的原因 COALESCE ...
    99+
    2024-05-01
    mysql
  • C++ 函数返回数组时有什么区别?
    c++++函数返回数组时有两种行为:通过值返回副本,对副本的更改不影响原始数组;通过引用返回原始数组的引用,对返回数组的更改直接反映在原始数组中。 C++ 函数返回数组时的区别 在 C...
    99+
    2024-04-19
    函数 c++ 数组
  • mysql中COALESCE函数为什么会失效
    mysql 中 coalesce 函数失效的原因是:参数全是 null参数类型不兼容传递 null 表达式次要错误 MySQL 中 COALESCE 函数失效的原因 COALESCE ...
    99+
    2024-05-01
    mysql
  • golang函数返回值的类型是什么?
    go 函数可返回一个或多个类型的值,需在签名中明确指定。单返回值函数返回特定类型的单个值,而多返回值函数返回按顺序指定类型的多个值。实际应用中,如计算两个数字最大公约数 (gcd) 的函...
    99+
    2024-04-22
    返回值 golang 类型 最大公约数
  • Golang 函数返回值的类型是什么?
    go 函数可以返回多个不同类型的值,返回值类型在函数签名中指定,并通过 return 语句返回。例如,函数可以返回一个整数和一个字符串:func getdetails() (int, s...
    99+
    2024-04-13
    类型 函数返回值 golang 代码可读性
  • C++ 函数返回自定义类型时有什么要求?
    c++++ 函数可以返回自定义类型,满足如下要求:类型完整定义。默认构造函数。值类型需要复制构造函数。 C++ 函数返回自定义类型 C++ 允许函数返回自定义类型,这意味着您可以让函数...
    99+
    2024-04-19
    c++ 自定义类型
  • php怎么使用函数返回一个变量
    小编给大家分享一下php怎么使用函数返回一个变量,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在php中,我们时常会需要将变量返回或输出,那么这时候我们应该怎么去...
    99+
    2023-06-20
  • C++ 函数返回引用类型有什么好处?
    c++++ 中的函数返回引用类型的好处包括:性能提升:引用传递避免了对象复制,从而节省了内存和时间。直接修改:调用方可以直接修改返回的引用对象,而无需重新赋值。代码简洁:引用传递简化了代...
    99+
    2024-04-20
    函数 c++ 引用
  • 如果任何参数为 NULL,MySQL EXPORT_SET() 函数返回什么?
    如果 MySQL EXPORT_SET() 函数中提供的任何参数为 NULL,则该函数将返回 NULL。以下示例将演示它 -示例mysql> Select EXPORT_SET(NULL, 'Y','N'...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作