为了账号安全,请及时绑定邮箱和手机立即绑定

描述任何 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编译错误。现在,我知道我可以使用 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 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号