zzz*_*zzz 41
Go函数是一等值.您无需恢复动态语言的技巧.
package main
import "fmt"
func someFunction1(a, b int) int {
return a + b
}
func someFunction2(a, b int) int {
return a - b
}
func someOtherFunction(a, b int, f func(int, int) int) int {
return f(a, b)
}
func main() {
fmt.Println(someOtherFunction(111, 12, someFunction1))
fmt.Println(someOtherFunction(111, 12, someFunction2))
}
Run Code Online (Sandbox Code Playgroud)
输出:
123
99
Run Code Online (Sandbox Code Playgroud)
如果函数的选择取决于某些仅运行时的已知值,则可以使用映射:
m := map[string]func(int, int) int {
"someFunction1": someFunction1,
"someFunction2": someFunction2,
}
...
z := someOtherFunction(x, y, m[key])
Run Code Online (Sandbox Code Playgroud)
mna*_*gel 14
接受的答案答案可能是你应该做的.
这是一种使用反射的方法,它允许传递灵活数量的参数.目前,它需要手动构建支持函数的列表(映射)(请参阅main方法),但这可以改进.
package main
import "fmt"
import "reflect"
import "errors"
func foo() {
fmt.Println("we are running foo")
}
func bar(a, b, c int) {
fmt.Println("we are running bar", a, b, c)
}
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() {
// nota bene: for perfect score: use reflection to build this map
funcs := map[string]interface{} {
"foo": foo,
"bar": bar,
}
Call(funcs, "foo")
Call(funcs, "bar", 1, 2, 3)
}
Run Code Online (Sandbox Code Playgroud)