2015-12-02 128 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) 
    } 
} 

我完全不知道你想在這裏實現什麼。你可以採取未知數量的未知類型的參數。但你不應該。 可以和應該做的是採取未知數量的參數滿足你寫的一個自定義接口,並將在你的函數內使用,否則它沒有任何意義,並會在一個點上強制你使用反射了解參數的類型。

如果您嘗試避免使用強類型語言,則沒有意義。

相關問題