首頁 > 後端開發 > Golang > 主體

如何執行類型為受多個返回類型約束的泛型類型的回呼?

WBOY
發布: 2024-02-12 17:06:05
轉載
677 人瀏覽過

如何執行類型為受多個返回類型約束的泛型類型的回呼?

問題內容

我試圖在我的函數中允許一個允許多個返回元組的回調參數。為了實現這一點,我使用泛型來定義回呼的參數類型。

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

登入後複製

以上是如何執行類型為受多個返回類型約束的泛型類型的回呼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!