我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?

知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我可以定义一个通用函数:

package hello

func iszero[t int64|float64](value t) bool {
   return value == 0
}

然后,如果我尝试在另一个包中为该函数添加别名,则会失败:

package world

import "hello"

var iszero = hello.iszero

以上内容无法编译:

无法在没有实例化的情况下使用通用函数 hello.iszero

相反,这有效:

var IsZero = hello.IsZero[int64]

是否可以使用其他语法来做到这一点?


正确答案


如果函数很小,就像问题中那样,那么直接提供它可能会更容易:

package vendor

func thisisjustcopy[t int64|float64](value t) bool {
   return value == 0
}

但是如果函数很大,你可以这样做:

package world
import "hello"

func iszero[t int64|float64](value t) bool {
   return hello.iszero(value)
}

这不是别名。事实上,你已经有了答案。但如果你想要一个正式的参考,来自语言规范,Instantiations:

因此,当您尝试初始化函数类型的变量时,函数 hello.iszero 不会被调用,因此需要使用特定类型参数进行实例化:

// not called, instantiated with int64
var iszero = hello.iszero[int64]

此时变量(为了清楚起见,让我们给它起一个不同的名称)zerofunc 具有具体的函数类型:

var zerofunc = iszero[int64]
    fmt.printf("type: %t\n", zerofunc)

打印:

type: func(int64) bool

这可能是也可能不是您想要的,因为这有效地单态化了函数。

如果您只想拥有一个具有相同实现(或其调整版本)的本地符号,则可以声明“包装器”函数。请记住,包装器的类型参数只能与被包装器的类型参数一样严格更严格

例如鉴于

iszero[t int64 | float64](v t)

你的包装不能

wrapiszeropermissive[t int64 | float64 | complex128](v t) bool {
    return iszero(v) // does not compile, t's type set is a superset
}

但是可以

WrapIsZeroStricter[T int64](v T) bool {
    return IsZero(v) // ok, T's type set is a subset
}

今天关于《如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?

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

下载Word文档

猜你喜欢

如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?

知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头
如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?
2024-04-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录