2014-09-10 48 views
1

如何在Golang中傳遞一個函數作爲可能有多個參數的參數,例如: fmt.Printf參數作爲變量數量的參數

第一個問題是必須先定義要傳遞的函數的類型。

type FunctionWithVariableArgumentLength func(s string, object1 type1, ..., objectn typen) 

的第二個問題是,一個人不知道在列表中的參數可以在fmt.Printf有什麼類型的,等等。

回答

4

有一個原型作爲其他功能:http://golang.org/pkg/fmt/#Printf

所以,你可以定義你的函數接受一個函數作爲這樣的說法:

func exe(f func(string, ...interface{}) (int, error)) { 
    f("test %d", 23) 
} 
func main() { 
    exe(fmt.Printf) 
} 

Demonstration

+0

同樣的想法,更完整。 +1 – VonC 2014-09-10 12:44:19

2

你會使用類似的簽名作爲一個fmt.Printf

func yourFunction(a ...interface{}) 
2

要回答第一部分:用可變數量的參數編寫函數。

// sums returns the total of a variable number of arguments 
func sum(numbers ...int) total int { 
    total = 0 
    for _, n := range numbers { 
     total += n 
    } 
    return total 
} 

第二部分是較硬但功能定義如下所示:

func doVarArgs(fmt string, a ...interface{}) { 

可變a包含類型interface{}的值的切片。然後遍歷片拉動每個參數,並使用包「反射」來查詢每個參數的類型。

請參閱http://golang.org/pkg/reflect/瞭解詳細說明。