在 Golang 中从一个函数列表中选择一个函数

7

如果我有任意数量的函数的切片或数组,如何选择只返回int类型的函数或只选择需要int类型参数的函数?

我想我需要使用反射包,但仅仅阅读文档并没有帮助我弄清楚具体该如何做。


请查看此处关于 golang-nuts 的主题讨论是否有帮助:https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/uGTYQzJ9Cfs - Paolo Falabella
1
你能解释一下你试图解决的问题,而不是你试图实现的解决方案吗?在Go中可能有更简单的方法。你正在尝试的方法在Go中非常笨拙。根据你想做什么,dystroy的建议可能是你唯一的选择,但很有可能你可以做一些更少令人困惑的事情。 - jorelli
不,实际上我想做的是很混乱的。考虑创建一个图形,其中每个节点都是一个函数。我想在给定任意函数列表的情况下搜索图形空间。这个想法是可以用作函数逼近器,就像机器学习一样。我认为dystroy的解决方案就是我想要的。如果您想建议一种更好的语言,我会考虑的。我听说C#也可以做到。 - placeybordeaux
啊,我没有机器学习的经验来给出建议,但听起来你可以使用函数类型作为字段,例如 type Node struct { Neighbors []*Node; Fn func(int...) int},或者使用递归接口,如 type Node interface { Children []Node; Fn(int...) int }。可能有一种方法可以避免反射,这将为您节省一些麻烦。Rob Pike 的演讲“Go 中的词法扫描”讨论了递归接口的事情。它非常有用。 - jorelli
我会看一下那个讲座,但难点在于我想要将其通用化,以便与任何任意函数配合使用,并自动确定它可以适合正在构建的图形的位置。如果我按照您所建议的方式去做,那么它基本上就是神经网络的另一种变体。 - placeybordeaux
1
你是对的:事实上,那确实很令人困惑。无论如何,在Go语言中,函数类型可以在其上拥有方法,这意味着interface{}值可以包含函数类型(因为即使方法集为空,函数类型仍然具有方法集)。如果你定义了一个type Node struct { F interface{} }并将函数放入其中,你可以使其更易于维护:http://play.golang.org/p/ANJBr1i8Zh。很酷的问题。 - jorelli
1个回答

12

这个程序打印出以整数 int 作为参数或返回值的函数:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    funcs := make([]interface{}, 3, 3) // I use interface{} to allow any kind of func
    funcs[0] = func (a int) (int) { return a+1} // good
    funcs[1] = func (a string) (int) { return len(a)} // good
    funcs[2] = func (a string) (string) { return ":("} // bad
    for _, fi := range funcs {
        f := reflect.ValueOf(fi)
        functype := f.Type()
        good := false
        for i:=0; i<functype.NumIn(); i++ {
            if "int"==functype.In(i).String() {
                good = true // yes, there is an int among inputs
                break
            }
        }
        for i:=0; i<functype.NumOut(); i++ {
            if "int"==functype.Out(i).String() {
                good = true // yes, there is an int among outputs
                break
            }
        }
        if good {
            fmt.Println(f)
        }
    }
}

我认为这段代码很容易理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接