Go动态运行函数

package main
import (
    "fmt"
    "os"
)
var f func() string
//根据传入的参数动态执行不同的函数
func init() {
    if len(os.Args) > 1 {
        if os.Args[1] == "a" {
            f = func() string {
                return "bingo"
            }
        } else {
            f = func() string {
                return os.Args[1]
            }
        }
    }
}

func main() {
    fmt.Println(f())
}
package main 
import (
    "fmt"
    "strings"
)

//对相同函数签名的函数进行动态调用
func double(data string) string {
    return data + data
}
func upper(data string) string {
    return strings.ToUpper(data)
}

var command = map[string]func(data string) string {
    "double":double, "upper":upper }

func call(com, data string) string {
    if function, ok := command[com]; ok {
        return function(data)
    }
    return  ""
}

func main() {
    var com string = "upper"
    var data string = "abcd"
    fmt.Println(call(com, data))

    com = "double"
    fmt.Println(call(com, data))

}
package main
import (
    "fmt"
    "reflect"
)

//实现对不同函数签名的函数动态调用
//简单起见,函数都没有带返回值.
func print(data string) {
    fmt.Println("print:", data)
}

func add(a, b int) {
    fmt.Println("add: ", a+b)
}
var command = map[string]interface{} {
    "print":print, "add":add}

func call(name string, params ...interface{}) {
    //获取反射对象
    f := reflect.ValueOf(command[name])
    //判断函数参数和传入的参数是否相等
    if len(params) != f.Type().NumIn() {
        return
    }
    //然后将传入参数转为反射类型切片
    in := make([]reflect.Value, len(params))
    for k, param := range params {
        in[k] = reflect.ValueOf(param)
    }
    //利用函数反射对象的call方法调用函数.
    f.Call(in)
}

func main() {
    call("print", "abcdef")
    call("add", 7, 9)
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值