Go コードを動的に評価するための JavaScript の `eval()` 関数に相当するものはありますか?

Linda Hamilton
リリース: 2024-11-21 10:44:11
オリジナル
846 人が閲覧しました

Is there an equivalent to JavaScript's `eval()` function for dynamic evaluation of Go code?

eval() を使用した Go コードの評価

はじめに

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート