iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何执行类型为受多个返回类型约束的泛型类型的回调?
  • 146
分享到

如何执行类型为受多个返回类型约束的泛型类型的回调?

2024-02-12 17:02:54 146人浏览 泡泡鱼
摘要

问题内容 我试图在我的函数中允许一个允许多个返回元组的回调参数。为了实现这一点,我使用泛型来定义回调的参数类型。 func get[ in any, out any,

问题内容

我试图在我的函数中允许一个允许多个返回元组的回调参数。为了实现这一点,我使用泛型来定义回调的参数类型。

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")
}

以上就是如何执行类型为受多个返回类型约束的泛型类型的回调?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 如何执行类型为受多个返回类型约束的泛型类型的回调?

本文链接: https://www.lsjlt.com/news/563862.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作