Golang 调用字符串函数

首先,来看看这段 PHP 代码:

function foobar() {
    echo "Hello Golang\n";
}
$funcs = array(
    "foobar" => "foobar",
    "hello"  => "foobar",
);
$funcs["foobar"]();
$funcs["hello"]();

它会输出:

Hello Golang
Hello Golang

用这个方法调用匹配名字的函数,非常有效。

那么,在 Golang 中是否可能用函数的名字来调用某个函数呢?

方案一

这个 map 仅仅可以用原型是“func()”的没有输入参数或返回值的函数。

package main

import "fmt"

func funcs1()  {
    fmt.Println("我是 funcs1 函数 ....")
}

func funcs2()  {
    fmt.Println("我是 funcs2 函数 ....")
}

func main() {
    // 这个 map 仅仅可以用原型是“func()”的没有输入参数或返回值的函数。
    funcs := map[string]func(){
        "funcs1": funcs1,
        "funcs2": funcs2,
    }

    // 调用字符串函数
    funcs["funcs1"]()
    funcs["funcs2"]()
}

输出:

我是 funcs1 函数 ....
我是 funcs2 函数 ....

方案二

利用反射使所调用的函数,支持参数传入。

package main

import (
    "errors"
    "fmt"
    "reflect"
)

func funcs11(a, b int)  {
    fmt.Println("我是 funcs11 函数 ...")
    fmt.Printf("我的参数是:%#v, %#v\n", a, b)
    fmt.Println("====================")
}

func funcs12(a, b string)  {
    fmt.Println("我是 funcs12 函数 ...")
    fmt.Printf("我的参数是:%#v, %#v\n", a, b)
    fmt.Println("====================")
}

// @title 利用 map 调用字符串函数
// @params m map
// @params name 函数名
// @params params 函数所需要的参数
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(fmt.Sprintf("必须传入 %v 个参数", f.Type().NumIn()))
        return
    }
    in := make([]reflect.Value, len(params))
    for k, param := range params{
        in[k] = reflect.ValueOf(param)
    }
    result = f.Call(in)
    return
}

func main() {
    // 定义字符串函数 map
    funcs := map[string]interface{}{
        "funcs11": funcs11,
        "funcs12": funcs12,
    }
    // 调用 map 中的函数
    result, err := Call(funcs, "funcs11", 100)
    if err != nil {
        fmt.Println("调用 funcs11 函数时出错:")
        fmt.Println(result, err)
        fmt.Println()
    }
    _, _ = Call(funcs, "funcs12", "张三", "18岁")
}

输出:

调用 funcs11 函数时出错:
[] 必须传入 2 个参数

我是 funcs12 函数 ...
我的参数是:"张三", "18岁"
====================
讨论数量: 0

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!