我正在尝试构建generic currying函数,如下所示:
package curry
import (
"fmt"
"reflect"
)
// Function
type fn interface{}
// Function parameter
type pr interface{}
// It return the curried function
func It(f fn, p ...pr) (fn, error) {
// examine the concret type of the function f
if reflect.ValueOf(f).Kind() == reflect.Func {
// Get the slice of input and output parameters type
} else {
return nil, fmt.Errorf("%s", "takes a function as a first parameter")
}
// _, _ = f, p
return nil, nil
}
是否可以将输入和输出参数类型的片段提取为函数[]reflect.Type
的{{1}}?
答案 0 :(得分:3)
您可以使用reflect.Type.In(int)
和reflect.Type.Out(int)
,有相应的方法NumIn() int
和NumOut() int
可以为您提供输入/输出的数量。
但是,请记住一些警告:
如果你绝对不得不做这样的事情,我会强烈建议你创建一个界面并让每个实现都自己进行讨论,而不是试图在所有情况下“通用”地破解它,这将永远不会像Go一样1.2.1。
答案 1 :(得分:1)
Go 1.5将添加一个可以帮助的功能。
(review 1996)commit e1c1fa2,Dave (okdave
)
// FuncOf returns the function type with the given argument and result types.
// For example if k represents int and e represents string,
// FuncOf([]Type{k}, []Type{e}, false) represents func(int) string.
//
// The variadic argument controls whether the function is variadic. FuncOf
// panics if the in[len(in)-1] does not represent a slice and variadic is
// true.
func FuncOf(in, out []Type, variadic bool) Type
测试用例包括这个有趣的代码:
v := MakeFunc(FuncOf([]Type{TypeOf(K(""))}, []Type{TypeOf(V(0))}, false), fn)
outs := v.Call([]Value{ValueOf(K("gopher"))})