如何在Golang中傳遞一個函數作爲可能有多個參數的參數,例如: fmt.Printf
?參數作爲變量數量的參數
第一個問題是必須先定義要傳遞的函數的類型。
type FunctionWithVariableArgumentLength func(s string, object1 type1, ..., objectn typen)
的第二個問題是,一個人不知道在列表中的參數可以在fmt.Printf
有什麼類型的,等等。
如何在Golang中傳遞一個函數作爲可能有多個參數的參數,例如: fmt.Printf
?參數作爲變量數量的參數
第一個問題是必須先定義要傳遞的函數的類型。
type FunctionWithVariableArgumentLength func(s string, object1 type1, ..., objectn typen)
的第二個問題是,一個人不知道在列表中的參數可以在fmt.Printf
有什麼類型的,等等。
有一個原型作爲其他功能:http://golang.org/pkg/fmt/#Printf
所以,你可以定義你的函數接受一個函數作爲這樣的說法:
func exe(f func(string, ...interface{}) (int, error)) {
f("test %d", 23)
}
func main() {
exe(fmt.Printf)
}
你會使用類似的簽名作爲一個fmt.Printf
func yourFunction(a ...interface{})
要回答第一部分:用可變數量的參數編寫函數。
// 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/瞭解詳細說明。
同樣的想法,更完整。 +1 – VonC 2014-09-10 12:44:19