【发布时间】:2015-12-02 17:12:59
【问题描述】:
假设我有一个像下面这样的程序
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)
}
另一行说
添加 、 和
及相关功能
func AddNum(n1, n2, n3 int) {
sum := n1 + n2 + n3
fmt.Println("Sum is : ", sum)
}
我有一种机制可以扫描所有功能并将其添加到地图中,并带有相关的场景。我的程序知道要执行哪个函数、它的参数数量和参数。
我的问题是,如何使地图通用,以便我可以使用不同数量/类型的参数存储不同的函数。
【问题讨论】:
-
您有
reflection和interface标签,但是这两个主题都不在您的问题中。 “通用”答案是使用可变参数函数。你能解释一下为什么你不想使用可变参数函数吗?func Three无效,所以我不确定你想通过混合类型来完成什么。 -
@JimB 假设我的函数三是 func Three(n1 string,n2 bool,n3 int) { fmt.Println("Foo = ",n1, n2, n3) } 在这种情况下我可以不使用可变参数对吗?
-
你这里有一个人为的例子,这没有任何意义。您出于某种原因与类型系统作斗争,但我不确定为什么。你只想要
type Executable func(...interface{})吗? -
正如@JimB 提到的,我认为您想使用
interface{}类型。这允许具有不同类型的不同数量的参数。或者根据您真正想要实现的目标,您也可以使用...CustomInterface{}并定义对您的功能有用的自己的界面。
标签: reflection go interface