亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

描述任何 go 函數的類型

描述任何 go 函數的類型

Go
慕妹3146593 2022-06-01 16:18:41
我想編寫一個將函數部分應用于參數的函數,如下所示:func partial(f AnyFuncType, arg interface{}) AnyFuncType {   return func(args ...interface{}) interface{} {        return f(arg, args)   }}type AnyFuncType func(args ...interface{}) interface{}但是即使使用像這樣最簡單的功能也不起作用func sum(a int, b int) int {  return a + b} func main() {  addToFive := partial(sum, 5)}因為我得到./prog.go:16:23: cannot use sum (type func(int, int) int) as type AnyFuncType in argument to partial編譯錯誤?,F在,我知道我可以使用 interface{},但是有沒有辦法為 f 指定一個更精確的類型,它可以與任何函數一起使用?
查看完整描述

3 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

您試圖將interface{}其視為泛型類型,但interface{}不是泛型類型,并且 go 將不匹配interface{}作為采用具體類型的函數的簽名的函數的簽名。



查看完整回答
反對 回復 2022-06-01
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

用于interface{}表示任何類型的函數。沒有更精確的類型適用于任何功能。


使用反射包來實現partial。


func partial(f interface{}, arg interface{}) interface{} {

    v := reflect.ValueOf(f)

    t := v.Type()


    var in []reflect.Type

    for i := 1; i < t.NumIn(); i++ {

        in = append(in, t.In(i))

    }


    var out []reflect.Type

    for i := 0; i < t.NumOut(); i++ {

        out = append(out, t.Out(i))

    }


    var va reflect.Value

    if arg != nil {

        va = reflect.ValueOf(arg)

    } else {

        // Support `nil` as partial argument.

        va = reflect.Zero(t.In(0))

    }


    return reflect.MakeFunc(reflect.FuncOf(in, out, t.IsVariadic()),

        func(args []reflect.Value) []reflect.Value {

            return v.Call(append([]reflect.Value{va}, args...))

        }).Interface()

}

像這樣使用它:


addToFive := partial(sum, 5).(func(int) int)

fmt.Println(addToFive(1))

在操場上運行它。


我建議使用閉包來創建部分而不是partial這個答案中的函數。閉包更有效,避免了棘手的反射代碼。


addToFive := func(x int) int { return sum(5, x) }

fmt.Println(addToFive(1))


查看完整回答
反對 回復 2022-06-01
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

問題是,GO 中的子類型僅適用于交互。由于 AnyFuncType 不是接口,因此這不起作用。



查看完整回答
反對 回復 2022-06-01
  • 3 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號