iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > GO >如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?
  • 409
分享到

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

2024-04-04 23:04:23 409人浏览 薄情痞子
摘要

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

知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个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
}

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

您可能感兴趣的文档:

--结束END--

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

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

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

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

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

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作