简介
在 JavaScript 中,eval() 函数允许您执行动态的代码或表达式。 Go 中是否有等效的函数可以计算 Go 代码?
回答
是的,可以动态地计算 Go 表达式。其关键组件是 go/types 包。具体方法如下:
首先,创建一个包对象来保存要评估的代码,并创建一个scope.Scope对象来定义其中的范围代码将执行。
package eval import ( "go/ast" "go/constant" "go/parser" "go/token" "go/types" ) var ( // Create a new package object to hold the evaluated code. pkg = types.NewPackage("eval", "example.com/eval") // Create a new scope object to define the scope of evaluation. scope = types.NewScope(nil, token.NewFileSet()) )
eval() 函数通常允许计算引用已定义变量或常量的表达式。为了在 Go 中模拟这种行为,我们可以在求值范围中插入常量。
// Insert a constant named "x" with value 10 into the scope. scope.Insert(scope.Lookup("x"), &types.Const{ Val: constant.MakeInt64(10), Type: pkg.Scope().Lookup("int").Type(), // Lookup the "int" type from the package's scope. Pkg: pkg, Name: "x", Kind: types.Const, Obj: nil, // We don't need an Object for introducing constants directly. Alias: false, })
接下来,您需要解析要求值的 Go 表达式并创建一个 AST(抽象语法树)。一旦你有了 AST,你就可以在 go/types 包的帮助下评估表达式。
// Parse the input Go expression. expr, err := parser.ParseExpr("x + 17") if err != nil { panic(err) } // Evaluate the expression in the defined scope. result, err := types.Eval(expr, scope) if err != nil { panic(err) }
评估的结果将存储在 result 中变量作为常量。值。您可以根据需要将其转换为所需的类型。在您的示例中,您可以使用以下方式获取结果:
intResult, ok := constant.Int64Val(result) if !ok { panic("failed to convert result to int") }
按照以下步骤,您可以实现 Go 代码的动态评估,类似于 JavaScript 中的 eval() 函数。
以上是是否有相当于 JavaScript 的'eval()”函数来动态评估 Go 代码?的详细内容。更多信息请关注PHP中文网其他相关文章!