使用反射检查分配给 interface{} 变量的函数签名

我正在尝试构建一个 通用的 咖喱 看起来像这样的功能:


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从函数中提取输入和输出参数类型的切片f?


Qyouu
浏览 170回答 2
2回答

开心每一天1111

Go 1.5 将添加一个可以在这里提供帮助的功能。(回顾 1996 年,由Dave ( )提交 e1c1fa2)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"))})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go