Reflection golang可以将参数数目未知的函数作为另一个函数的参数吗

Reflection golang可以将参数数目未知的函数作为另一个函数的参数吗,reflection,go,interface,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

假设我有一个如下的程序

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
函数作为一个通用函数,它可以接收具有不同类型的不同数量的参数的函数,
可执行文件的类型应该是什么

换句话说,如果我取消注释上面程序中的注释行,它将中断。我应该对行
type Executable func(int)
进行什么修改才能使其工作

PS:请尝试给出一个一般性的答案,而不是针对我提到的确切场景给出一个变通方法

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

编辑:-我将更清楚地解释我的场景

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

例如:

对“某人”说“问候”

和相关函数

func SayGreeting(greeting, person string) {
    fmt.Println(greeting, ", ", person)
}
func AddNum(n1, n2, n3 int) {
    sum := n1 + n2 + n3
    fmt.Println("Sum is : ", sum)
}
另一行写着

加上

及其相关功能

func SayGreeting(greeting, person string) {
    fmt.Println(greeting, ", ", person)
}
func AddNum(n1, n2, n3 int) {
    sum := n1 + n2 + n3
    fmt.Println("Sum is : ", sum)
}
我有一个机制来扫描所有函数,并将其添加到一个映射中,以及相关的场景。我的程序知道要执行哪个函数,它的参数数量和参数

我的问题是,如何使映射通用,以便可以使用不同数量/类型的参数存储不同的函数

对“提到的确切情况”的回答是:

不能这样做。

(尤其是当你不应该这样做时)

对于“提到的确切情况”的答案是:

不能这样做。

(尤其是当你不应该的时候)

我完全不知道你在这里想要实现什么。可以接受数量未知且类型未知的参数。但你不应该。可以而且应该做的是获取未知数量的参数,这些参数满足您编写的自定义接口,并且将在函数中使用,否则这没有意义,并且会在某一点上迫使您使用反射来了解参数的类型

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

我完全不知道你在这里想要实现什么。可以接受数量未知且类型未知的参数。但你不应该。可以而且应该做的是获取未知数量的参数,这些参数满足您编写的自定义接口,并且将在函数中使用,否则这没有意义,并且会在某一点上迫使您使用反射来了解参数的类型


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

您有
反射
接口
标记,但这两个主题都不在您的问题中。“通用”答案是使用可变函数。你能解释一下为什么你不想使用可变函数吗
func-Three
无效,因此我不确定您希望通过混合类型来实现什么@JimB假设我的函数三是func三(n1 string,n2 bool,n3 int){fmt.Println(“Foo=”,n1,n2,n3)}在这种情况下,我不能使用varargs,对吗?这里的例子是人为的,没有意义。你为了某种原因和类型系统抗争,但我不知道为什么。您只需要
类型Executable func(…interface{})
?正如@JimB提到的,我认为您需要使用
接口{}
类型。这允许具有不同类型的不同数量的参数。或者,根据您真正想要实现的目标,您也可以使用
…CustomInterface{}
并定义对您的功能有用的您自己的接口。您有
反射
接口
标记,但这两个主题都不在您的问题中。“通用”答案是使用可变函数。你能解释一下为什么你不想使用可变函数吗
func-Three
无效,因此我不确定您希望通过混合类型来实现什么@JimB假设我的函数三是func三(n1 string,n2 bool,n3 int){fmt.Println(“Foo=”,n1,n2,n3)}在这种情况下,我不能使用varargs,对吗?这里的例子是人为的,没有意义。你为了某种原因和类型系统抗争,但我不知道为什么。您只需要
类型Executable func(…interface{})
?正如@JimB提到的,我认为您需要使用
接口{}
类型。这允许具有不同类型的不同数量的参数。或者,根据您真正想要实现的目标,您也可以使用
…CustomInterface{}
,并定义对您的功能有用的您自己的界面。我刚刚看到rob pike视频,他要求人们不要使用反射…正如@Depado的回答清楚显示的那样,您可以做到。也许你只是想说“语言的类型系统不是为此设计的,所以你不应该这样做”。@StefanoMozart不,我想说“不,你不能”。德帕达斯的回答是一般问题的一个有限实例,因为f(a…X)是一个带有一个类型为[]X的参数的函数。我刚刚看了罗伯·派克的视频,他要求人们不要使用反射……正如@Depado的回答清楚显示的那样,你可以这样做。也许你只是想说“语言的类型系统不是为此设计的,所以你不应该这样做”。@StefanoMozart不,我想说“不,你不能”。Depadas答案是一般问题的一个有限实例,因为f(a…X)是一个具有一个类型为[]X的参数的函数。