golang可以将具有未知数量参数的函数作为另一个函数的参数

时间:2015-12-02 17:12:59

标签: reflection go interface

假设我有一个如下的程序

package main

import "fmt"

func main() {
    Execute(1,One)
//  Execute(2,Two)
//  Execute(3,Three)
}

type Executable func(int)

func Execute(noOfArgs int, fn Executable){
    switch noOfArgs {
        case 1 : fn(1)
//      case 2 : fn(1,2)
//      case 3 : fn("1",2,3)
    }
}
func One(n int) {
    fmt.Println("Foo = ",n)
}
func Two(n1,n2 int) {
    fmt.Println("Foo = ",n1+n2)
}
func Three(n1 string,n2,n3 int) {
    fmt.Println("Foo = ",n1+n2+n3)
}

我想将Execute函数作为通用函数,可以接收具有不同类型的不同类型参数的函数,Executable的类型应该是什么?

换句话说,如果我取消注释上述程序中的注释行,它将会中断。我应该对第type Executable func(int)行进行哪些修改才能使其正常工作?

PS:请尝试提供一般性答案,而不是针对我提到的具体情况提供解决方法

编辑: - 这不是this问题的重复。 我不是在寻找扩大论点。我将有不同类型的参数和不同数量的参数

编辑: - 我会更清楚地解释我的情景。

我有一个BDD样式测试执行器,它使用适当的参数解析一行文本并执行与之关联的函数。

例如: -

  

说"问候"某人"

和相关的功能

func SayGreeting(greeting, person string) {
    fmt.Println(greeting, ", ", person)
}

另一行说

  

添加< 2> ,< 3>和< 4>

及相关功能

func AddNum(n1, n2, n3 int) {
    sum := n1 + n2 + n3
    fmt.Println("Sum is : ", sum)
}

我有一种机制来扫描所有功能并将其添加到地图中,并附带相关场景。我的程序知道要执行哪个函数,它的参数个数和参数。

我的问题是,如何使地图具有通用性,以便我可以使用不同数量/类型的参数存储不同的函数。

2 个答案:

答案 0 :(得分:3)

答案"提到的确切情景"是:

不能 执行 这个。

(特别是你不应该这样做。)

答案 1 :(得分:2)

package main

import "fmt"

func Simple(args ...interface{}) {
    fmt.Println("Foo =", fmt.Sprint(args...))
}

func main() {
    Execute(1, Simple)
    Execute(2, Simple)
    Execute(3, Simple)
}

type Executable func(...interface{})

func Execute(noOfArgs int, fn Executable) {
    switch noOfArgs {
    case 1:
        fn(1)
    case 2:
        fn(1, 2)
    case 3:
        fn("1", 2, 3)
    }
}

我完全不知道你在这里想要达到的目标。您可以使用未知类型的未知数量的参数。但你不应该。你可以而且应该做的是采用未知数量的参数,这些参数满足您编写的自定义界面并且将在您的函数中使用,否则它没有意义并且将会在一点强迫您使用反射来了解参数的类型。

如果你试图避免使用类型,那么使用强类型语言是没有意义的。