如何执行类型为受多个返回类型约束的泛型类型的回调?
短信预约 -IT技能 免费直播动态提醒
问题内容
我试图在我的函数中允许一个允许多个返回元组的回调参数。为了实现这一点,我使用泛型来定义回调的参数类型。
func get[
in any,
out any,
translatefn func(in) out | func(in) (out, error),
](
input in,
translate translatefn,
) (*out, error) {
// call translate to convert the input to the output.
// if translate is an erroring function, make sure the error is
// forwarded to the response of this function.
}
由于 translatefn 仅限于这两种返回类型中的任何一个(out
或 (out, error)
),我认为我能够调用它。
我想做的是类似下面的事情,但是我不能,因为我无法在 translate
参数上使用类型断言。
invalid operation: cannot use type assertion on type parameter value translate (variable of type translatefn constrained by func(in) out|func(in) (out, error))
func Get[
In any,
Out any,
TranslateFn func(In) Out | func(In) (Out, error),
](
input In,
translate TranslateFn,
) (*Out, error) {
if erroringFn, isErroringTranslateFn := translate.(func(In) (Out, error)); isErroringTranslateFn {
out, err := erroringFn(input)
if err != nil {
return nil, err
}
return &out, nil
}
if nonErroringFn, isNonErroringTranslateFn := translate.(func(In) Out); isNonErroringTranslateFn {
out, err := nonErroringFn(input)
if err != nil {
return nil, err
}
return &out, nil
}
panic("translate function must be either func(In) (Out, error) or func(In) Out")
}
如果没有类型断言,我将如何调用此回调,或确定提供了哪些通用变体?
解决方法
首先将其包装到接口中,然后进行类型断言(或类型切换)。例如。 any(v).(t)
func Get[
In any,
Out any,
TranslateFn func(In) Out | func(In) (Out, error),
](
input In,
translate TranslateFn,
) (*Out, error) {
switch f := any(translate).(type) {
case func(In) (Out, error):
out, err := f(input)
if err != nil {
return nil, err
}
return &out, nil
case func(In) Out:
out := f(input)
return &out, nil
}
panic("shouldn't happen")
}
以上就是如何执行类型为受多个返回类型约束的泛型类型的回调?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341