假设我有一个如下的程序
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)
}
我有一种机制来扫描所有功能并将其添加到地图中,并附带相关场景。我的程序知道要执行哪个函数,它的参数个数和参数。
我的问题是,如何使地图具有通用性,以便我可以使用不同数量/类型的参数存储不同的函数。
答案 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)
}
}
我完全不知道你在这里想要达到的目标。您可以使用未知类型的未知数量的参数。但你不应该。你可以而且应该做的是采用未知数量的参数,这些参数满足您编写的自定义界面并且将在您的函数中使用,否则它没有意义并且将会在一点强迫您使用反射来了解参数的类型。
如果你试图避免使用类型,那么使用强类型语言是没有意义的。