> 백엔드 개발 > Golang > Go 코드의 동적 평가를 위한 JavaScript의 `eval()` 함수에 해당하는 기능이 있습니까?

Go 코드의 동적 평가를 위한 JavaScript의 `eval()` 함수에 해당하는 기능이 있습니까?

Linda Hamilton
풀어 주다: 2024-11-21 10:44:11
원래의
914명이 탐색했습니다.

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)
}
로그인 후 복사

결과 및 결론

평가 결과는 결과에 저장됩니다. 변수를 상수로 사용합니다.값. 필요에 따라 원하는 유형으로 변환할 수 있습니다. 귀하의 예에서는 다음을 사용하여 결과를 얻을 수 있습니다.

intResult, ok := constant.Int64Val(result)
if !ok {
    panic("failed to convert result to int")
}
로그인 후 복사

이 단계를 수행하면 JavaScript의 eval() 함수와 유사한 Go 코드의 동적 평가를 얻을 수 있습니다.

위 내용은 Go 코드의 동적 평가를 위한 JavaScript의 `eval()` 함수에 해당하는 기능이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿