我是golang的新手,我正在处理以下结构:
type Flag[T any] struct {
defaultValue interface{}
}
其中T
可以是int
或bool
我定义了如下函数:
func (f Flag[T]) GetVariation(val interface{}, getFunc func(v T) T ) T {
inputVal := f.defaultValue.(T)
return getFunc(inputVal)
}
当我尝试将上述函数用于各种数据类型时,例如使用bool,例如:
func (f Flag[bool]) GetBoolVariation(val bool) bool {
return f.GetVariation(val, someFunc)
}
func someFunc(v bool) bool {
return true
}
我得到以下错误消息:
cannot use someFunc (value of type func(v bool) bool) as func(v bool) bool value in argument to f.GetVariation
这条信息非常令人困惑,因为它说我不能把“X”当作“X”。你能帮我找出我做错了什么吗?
1条答案
按热度按时间pjngdqdw1#
首先,在这里很难衡量你的大型用例,但是泛型可能不是最适合的,因为你要做运行时类型检查(例如,
f.defaultValue.(T)
)。其次,看起来你正在使用
go 1.20
,这确实会产生一个令人困惑的错误:https://go.dev/play/p/IpykGv6yxZt?v=goprev
使用最新的playground版本(在撰写本文时为
go 1.21
)会给出一个更详细的编译错误:https://go.dev/play/p/IpykGv6yxZt
指示指定类型
bool
的位置(./prog.go:13:14
)源于类型约束。所以,仅仅因为这个类型约束
bool
匹配非泛型函数签名:并不意味着它是一个精确的编译匹配。
你可以用this contrived example“解决”编译错误:
但是,我再次认为泛型可能不是您特定用例的最佳解决方案。