3 回答
TA贡献1802条经验 获得超6个赞
那不是别名。实际上,您已经有了答案。但是如果你想要一个正式的参考,从语言规范,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
}
TA贡献1794条经验 获得超7个赞
如果功能很小,就像在问题中一样,那么将它卖掉可能会更容易:
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)
}
- 3 回答
- 0 关注
- 85 浏览
添加回答
举报