ホームページ  >  記事  >  バックエンド開発  >  JavaScript の eval() のように Go コードを動的に実行するにはどうすればよいですか?

JavaScript の eval() のように Go コードを動的に実行するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-08 03:41:01925ブラウズ

How Can I Dynamically Execute Go Code Like JavaScript's eval()?

JavaScript の Eval() のような Go コード/式の実行

JavaScript では、eval() メソッドを使用すると、以下に基づいてコードを動的に実行できます。文字列入力。 Go で利用できる同様の機能はありますか?

解決策

はい、次のアプローチを使用して Go で同様の機能を実現できます:

パッケージ、スコープ、定数の使用:

  1. パッケージの作成: Go コードでカスタム パッケージを定義します。
  2. スコープの作成: コードが評価される環境を表すスコープ オブジェクトをパッケージ内に作成します。
  3. 定数の挿入: パッケージのスコープに定数を挿入します。これらの定数は、評価に使用できる値と変数を表します。
  4. 定数の構築: 適切な型情報を使用して定数を構築するには、types.NewConst() 関数を使用します。

使用例:

これは、Go で単純な式を評価する方法を示すコード スニペットです:

import (
    "fmt"

    "go/types"
)

func main() {
    // Create a new package
    pkg := types.NewPackage("mypkg", "github.com/example/mypkg")

    // Create a new scope
    scope := types.NewScope(pkg, nil)

    // Insert constants into the scope
    scope.Insert(types.NewConst("x", types.Int, types.NewInt64(10)))
    scope.Insert(types.NewConst("y", types.Int, types.NewInt64(20)))

    // Evaluate simple expressions
    expr1 := "x * y"
    expr2 := "2 + 2"
    expr3 := "x + 17"
    result1, _ := evaluate(pkg, scope, expr1)
    result2, _ := evaluate(pkg, scope, expr2)
    result3, _ := evaluate(pkg, scope, expr3)

    // Print the results
    fmt.Println(result1, result2, result3)
}

// evaluate takes a package, scope, and expression and evaluates the expression in the provided scope.
func evaluate(pkg *types.Package, scope *types.Scope, expr string) (types.Object, error) {
    // Check the expression
    if expr == "" {
        return nil, fmt.Errorf("empty expression")
    }

    // Parse the expression
    parsed, err := types.ParseExpr(expr)
    if err != nil {
        return nil, err
    }

    // Evaluate the expression
    return pkg.Check(parsed.Pos(), parsed), nil
}

このコードは、カスタム パッケージのスコープを設定し、入力文字列に基づいてコードを動的に評価できるようにします。

以上がJavaScript の eval() のように Go コードを動的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。