golang呼叫函數的方法:使用map變數明確的把字串和函數關聯起來,並透過【funcs["foo"]】得到函數對象,程式碼為【funcs := map[string ]interface{} "foo": foo】。
golang呼叫函數的方法:
應用場景
我們知道一個函數名,透過一個字串變數表示函數名,然後如何呼叫這個函數的函數。
func foo() { fmt.Println("in foo"); } var funcname string = "foo" func callFunc(funcname string) { ... } callFunc(funcname)
下面的問題是我們要如何實作callFunc()
的內容來完成所要的功能。
目前已知的辦法好像是不行的,無法從全域域中透過名字取得一個函數的物件。
(對於變數也一樣,無法從全域域中透過名字取得一個變數的物件)
可行的辦法
使用一個map變數顯式的把字串和函數(變數)關聯起來:
funcs := map[string]interface{} { "foo": foo, }
這樣我們可以透過funcs["foo"]
得到函數對象,然後才能對函數進行運算。
函數運算的例子
下面是一個函數呼叫的例子,包括參數的傳遞以及傳回值的處理。
package main import "fmt" import "reflect" import "errors" type MyStruct struct { i int s string } func foo0() int { fmt.Println("running foo0: ") return 100 } func foo1(a int) (string, string) { fmt.Println("running foo1: ", a) return "aaaa", "bbb" } func foo2(a, b int, c string) MyStruct { fmt.Println("running foo2: ", a, b, c) return MyStruct{10, "ccc"} } func Call(m map[string]interface{}, name string, params ... interface{}) (result []reflect.Value, err error) { f := reflect.ValueOf(m[name]) if len(params) != f.Type().NumIn() { err = errors.New("The number of params is not adapted.") return } in := make([]reflect.Value, len(params)) for k, param := range params { in[k] = reflect.ValueOf(param) } result = f.Call(in) return } func main() { funcs := map[string]interface{} { "foo0": foo0, "foo1": foo1, "foo2": foo2, } // call foo0 if result, err := Call(funcs, "foo0"); err == nil { for _, r := range result { fmt.Printf(" return: type=%v, value=[%d]\n", r.Type(), r.Int()) } } // call foo1 if result, err := Call(funcs, "foo1", 1); err == nil { for _, r := range result { fmt.Printf(" return: type=%v, value=[%s]\n", r.Type(), r.String()) } } // call foo2 if result, err := Call(funcs, "foo2", 1, 2, "aa"); err == nil { for _, r := range result { fmt.Printf(" return: type=%v, value=[%+v]\n", r.Type(), r.Interface().(MyStruct)) } } }
編譯運行:
running foo0: return: type=int, value=[100] running foo1: 1 return: type=string, value=[aaaa] return: type=string, value=[bbb] running foo2: 1 2 aa return: type=main.MyStruct, value=[{i:10 s:ccc}]
#相關學習推薦:Go語言教學
以上是golang如何呼叫函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!