登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-27 19:33:31 288浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面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
}

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

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>