Golang泛型-在传递函数指针时,不能使用一个类型代替相同类型

jobtbby3  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(129)

我是golang的新手,我正在处理以下结构:

type Flag[T any] struct {
    defaultValue interface{}
}

其中T可以是intbool
我定义了如下函数:

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”。你能帮我找出我做错了什么吗?

pjngdqdw

pjngdqdw1#

首先,在这里很难衡量你的大型用例,但是泛型可能不是最适合的,因为你要做运行时类型检查(例如,f.defaultValue.(T))。
其次,看起来你正在使用go 1.20,这确实会产生一个令人困惑的错误:
https://go.dev/play/p/IpykGv6yxZt?v=goprev

cannot use someFunc (value of type func(v bool) bool) as func(v bool) bool value in argument to f.GetVariation

使用最新的playground版本(在撰写本文时为go 1.21)会给出一个更详细的编译错误:
https://go.dev/play/p/IpykGv6yxZt

./prog.go:14:29: cannot use someFunc (value of type func(v bool) bool) as func(v bool /* with bool declared at ./prog.go:13:14 */) bool /* with bool declared at ./prog.go:13:14 */ value in argument to f.GetVariation

指示指定类型bool的位置(./prog.go:13:14)源于类型约束。
所以,仅仅因为这个类型约束bool匹配非泛型函数签名:

func someFunc(v bool) bool {
    return true
}

并不意味着它是一个精确的编译匹配。
你可以用this contrived example“解决”编译错误:

func someFuncFix[T any](v T) T {
    return v
}

func (f Flag[bool]) GetBoolVariation(val bool) bool {
    return f.GetVariation(val, someFuncFix[bool])

    // FYI: `return f.GetVariation(val, someFuncFix)` also works as the bool constraint could be inferred
}

但是,我再次认为泛型可能不是您特定用例的最佳解决方案。

相关问题