如何为通用函数创建别名以避免“在未实例化的情况下使用通用函数”错误?
知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个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