簡介
在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") }
依照下列步驟,您可以實作 Go 程式碼的動態評估,類似於 JavaScript 中的 eval() 函數。
以上是是否有相當於 JavaScript 的「eval()」函數來動態評估 Go 程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!