3 回答

TA貢獻1998條經驗 獲得超6個贊
您試圖將interface{}
其視為泛型類型,但interface{}
不是泛型類型,并且 go 將不匹配interface{}
作為采用具體類型的函數的簽名的函數的簽名。

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))
- 3 回答
- 0 關注
- 101 瀏覽
添加回答
舉報