我試圖在我的函數中允許一個允許多個返回元組的回調參數。為了實現這一點,我使用泛型來定義回呼的參數類型。
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中文網其他相關文章!