はじめに
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") }
これらの手順に従うことで、JavaScript の eval() 関数と同様に、Go コードの動的評価を実現できます。
以上がGo コードを動的に評価するための JavaScript の `eval()` 関数に相当するものはありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。