计算/执行Golang代码/表达式,如js';eval()

计算/执行Golang代码/表达式,如js';eval(),go,eval,Go,Eval,在golang上有类似eval()的方法吗? 计算/执行JavaScript代码/表达式: var x = 10; var y = 20; var a = eval("x * y") + "<br>"; var b = eval("2 + 2") + "<br>"; var c = eval("x + 17") + "<br>"; var res = a + b + c; 在戈朗这可能吗?为什么 在戈朗这可能吗?为什么 不,因为咕噜不是那种语言。它的目的是

在golang上有类似eval()的方法吗?

计算/执行JavaScript代码/表达式:

var x = 10;
var y = 20;
var a = eval("x * y") + "<br>";
var b = eval("2 + 2") + "<br>";
var c = eval("x + 17") + "<br>";

var res = a + b + c;
在戈朗这可能吗?为什么

在戈朗这可能吗?为什么

不,因为咕噜不是那种语言。它的目的是编译,而不是解释,这样运行时就不包含任何“字符串到代码”转换器,或者确实知道语法正确的程序是什么样子


注意,在Go中,就像在大多数其他编程语言中一样,您可以编写自己的解释器,也就是说,一个接受字符串并相应地进行计算的函数。Go设计师的选择只是为了不把这种可疑的兴趣和安全性强加于所有不需要它的人。

这是完全可能的。至少对于表达式,这似乎是您想要的:

看看:


您需要创建自己的
范围
对象,并将
插入
常量到包的范围中。常量是使用
类型创建的。NewConst通过提供适当的类型信息来创建的。

没有内置的求值。但可以执行评估,该评估将遵循GoLang规范的大部分内容:/

例如:

import "github.com/apaxa-go/eval" 
...
src:="int8(1*(1+2))"
expr,err:=eval.ParseString(src,"")
if err!=nil{
    return err
}
r,err:=expr.EvalToInterface(nil)
if err!=nil{
    return err
}
fmt.Printf("%v %T", r, r)   // "3 int8"

也可以在求值表达式中使用变量,但需要将变量及其名称传递给Eval方法。

看看Github项目:

它允许运行更复杂的GO-Lang代码片段,但需要一个“temp”文件夹。

此示例在运行时解析GO代码:

包可能会满足您动态计算任何数学表达式的各种需求

package main

import (
    "fmt"

    "github.com/Pramod-Devireddy/go-exprtk"
)

func main() {
    exprtkObj := exprtk.NewExprtk()

    exprtkObj.SetExpression("x * y")

    exprtkObj.AddDoubleVariable("x")
    exprtkObj.AddDoubleVariable("y")

    exprtkObj.CompileExpression()

    exprtkObj.SetDoubleVariableValue("x", 10)
    exprtkObj.SetDoubleVariableValue("y", 20)

    a := exprtkObj.GetEvaluatedValue()
    
    exprtkObj.SetExpression("2 + 2")
    exprtkObj.CompileExpression()

    b := exprtkObj.GetEvaluatedValue()

    exprtkObj.SetExpression("x + 17")
    exprtkObj.CompileExpression()

    c := exprtkObj.GetEvaluatedValue()

    res := a + b + c

    fmt.Println(a, b, c, res)
}


此处链接的评估包不再维护欢迎使用StackOverflow!也许你可以添加更多细节,更好地解释你答案中最重要的部分。阅读以了解更多信息。而且,一旦你获得了更多的声誉,你就可以把它作为一个评论而不是一个答案来发布,这更合适。这是一个非常有限的库。它以字符串形式返回所有结果,如果您只是在CLI中将结果返回给用户,这非常好。它是concurent安全的吗?这是一个简单的AST操作,而不是运行时求值。您可以使用包求值任何类型的数学表达式。
package main

import (
    "fmt"
    "go/parser"
    "go/token"
)

func main() {
    fset := token.NewFileSet() // positions are relative to fset

    src := `package foo

import (
    "fmt"
    "time"
)

func bar() {
    fmt.Println(time.Now())
}`

    // Parse src but stop after processing the imports.
    f, err := parser.ParseFile(fset, "", src, parser.ImportsOnly)
    if err != nil {
        fmt.Println(err)
        return
    }

    // Print the imports from the file's AST.
    for _, s := range f.Imports {
        fmt.Println(s.Path.Value)
    }

}
package main

import (
    "fmt"

    "github.com/Pramod-Devireddy/go-exprtk"
)

func main() {
    exprtkObj := exprtk.NewExprtk()

    exprtkObj.SetExpression("x * y")

    exprtkObj.AddDoubleVariable("x")
    exprtkObj.AddDoubleVariable("y")

    exprtkObj.CompileExpression()

    exprtkObj.SetDoubleVariableValue("x", 10)
    exprtkObj.SetDoubleVariableValue("y", 20)

    a := exprtkObj.GetEvaluatedValue()
    
    exprtkObj.SetExpression("2 + 2")
    exprtkObj.CompileExpression()

    b := exprtkObj.GetEvaluatedValue()

    exprtkObj.SetExpression("x + 17")
    exprtkObj.CompileExpression()

    c := exprtkObj.GetEvaluatedValue()

    res := a + b + c

    fmt.Println(a, b, c, res)
}