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

Go で JavaScript の `eval()` の機能を実現するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-10 20:06:03670ブラウズ

How to Achieve the Functionality of JavaScript's `eval()` in Go?

Go で同等の JS eval()

JavaScript の eval() と同様の評価は、実際に Go で実行できます。これは、プログラム内で式を実行する場合に特に便利です。次の 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;

res の結果は次のようになります:

200
4
27

Go での実装

Go では、同等の機能は go/types パッケージによって提供されます。 Go で同じことを実現する方法は次のとおりです。

types.NewPackage と tables.Scope を使用して独自のパッケージを定義する必要があります。定数を定義するには、types.NewConst を使用して、適切な型情報を指定します。

package main

import (
    "fmt"
    "go/types"
)

func main() {
    // Create a new package and scope.
    pkg := types.NewPackage("example", "example.com/eval")
    scope := types.NewScope(pkg, types.RelativeToPkg, "")

    // Insert constants into the package's scope.
    x := types.NewConst(scope, "x", types.Int, types.NewInt64(10))
    y := types.NewConst(scope, "y", types.Int, types.NewInt64(20))

    // Define the expressions to be evaluated.
    exprA := "x * y"
    exprB := "2 + 2"
    exprC := "x + 17"

    // Evaluate the expressions.
    results := []int64{}
    for _, expr := range []string{exprA, exprB, exprC} {
        result, err := types.Eval(expr, scope)
        if err != nil {
            panic(err)
        }
        results = append(results, result.Int64())
    }

    // Print the results.
    fmt.Println("Results:")
    for _, result := range results {
        fmt.Println(result)
    }
}

この Go コードを実行すると、JavaScript の例と同じ結果が得られます。

200
4
27

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

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