2015-12-02 126 views
0

假设我有一个像下面可以golang采取与未知数量的参数的函数作为参数传递给另一个函数

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) 
} 

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

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

+1

你有'反射'和'接口'标签,但这两个主题都不在你的问题中。 “通用”答案是使用可变参数函数。你能解释为什么你不想使用可变参数函数吗? 'func Three'无效,所以我不确定你想通过混合类型来完成什么。 – JimB

+2

['类型可执行函数(... int)'](https://golang.org/ref/spec#Function_types)? – kostix

+0

@JimB假设我的函数三是 FUNC三(N1字符串,布尔N2,N3 INT){ fmt.Println( “富=”,N1,N2,N3) } 在我不能这样的情况下 使用可变参数对吗? –

回答

4

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

没有不能此。

(特别是当你不应该。)

+0

我刚刚看到抢劫派克视频,https://www.youtube.com/watch?v = PAAkCSZUG1c Hes问人们不要使用反射... – MIkCode

1
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) 
    } 
} 

我完全不知道你想在这里实现什么。你可以采取未知数量的未知类型的参数。但你不应该。 可以和应该做的是采取未知数量的参数满足你写的一个自定义接口,并将在你的函数内使用,否则它没有任何意义,并会在一个点上强制你使用反射了解参数的类型。

如果您尝试避免使用强类型语言,则没有意义。

相关问题