golang有没有类似php 中eval的这个函数?

golang有没有类似php 中eval的这个函数?
类似的东西有没有?

共 12 个回复


ThoseFlowers

golang是编译型语言,没有

# 0

seefan

我现在用的是javascript引擎解决这个问题的

# 1

Skycat

@seefan
同问用的那个包?在引擎中引用golang的上下文方便不?
非常感谢!

# 3

seefan

github.com/robertkrimen/otto

vm := otto.New()
    vm.Run(`
        abc = 2 + 2;
        var item={name:'my name',key:'hello world'};
        console.log("The value of abc is " , abc,item.name,item.key); // 4
    `)
使用还是非常方便的
# 4

seefan

上下文没有问题,可以和golang的函数和变量交互的

# 5

seefan

//运行任务
func runTask(task model.TimedTask) {
    now := time.Now()
    js := otto.New()
    js.Set("myutil", new(myutil))
    log.Infof("任务[%s]开始执行", task.TaskName)
    //log.Info(task.Content)
    val, err := js.Run(task.Content)
    if err == nil {
        if val.String() == "ok" {
            //任务执行完成
        }
        //log.Info(val)
    } else {
        log.Errorf("执行任务%s出错\n%s", task.TaskName, err.Error())
    }
    log.Infof("任务[%s]已完成,共耗时%f秒", task.TaskName, time.Since(now).Seconds())
}
# 6

Skycat

好像还行,一直在找一个golang的表达式引擎 要是支持表达式编译缓存就完美了 执行效率会更高

# 7

Zhangyc310

go-lua也可以类似的功能,不知道会不会轻量一点

- Lua, err := lua.NewLua(fmt.Sprintf("lua/plat_%d.lua", platId))
-     if err != nil {
-         log.Error("LUA ERROR : login.go line - 60")
-         return "0", false
-     }

-     Lua.L.GetGlobal("isLogin")
-     Lua.L.DoString(fmt.Sprintf("uid, isLogin = isLogin('%s', '%s', '%s', '%s')", otherId, session, sign, otherData))

-     uid := Lua.GetString("uid")
-     isLogin := Lua.GetBool("isLogin")

-     Lua.Close()
# 9

seefan

具体没有测试过,使用中还没有发现有瓶颈

# 10

zmguozi

哈哈,七牛搞了一个qlang,为go增加一个go原生语法的嵌入式支持.

# 11