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 关注
- 108 浏览
添加回答
举报