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的参数的函数。