소개
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) }
평가 결과는 결과에 저장됩니다. 변수를 상수로 사용합니다.값. 필요에 따라 원하는 유형으로 변환할 수 있습니다. 귀하의 예에서는 다음을 사용하여 결과를 얻을 수 있습니다.
intResult, ok := constant.Int64Val(result) if !ok { panic("failed to convert result to int") }
이 단계를 수행하면 JavaScript의 eval() 함수와 유사한 Go 코드의 동적 평가를 얻을 수 있습니다.
위 내용은 Go 코드의 동적 평가를 위한 JavaScript의 `eval()` 함수에 해당하는 기능이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!