Pengenalan
Dalam JavaScript, fungsi eval() membolehkan anda melaksanakan kod atau ungkapan secara dinamik. Adakah terdapat fungsi yang setara dalam Go yang boleh menilai kod Go?
Jawapan
Ya, adalah mungkin untuk menilai ungkapan Go secara dinamik. Komponen utama untuk ini ialah pakej go/types. Begini cara anda boleh melakukannya:
Pertama, cipta objek pakej untuk menyimpan kod yang akan dinilai dan skop. Objek Skop untuk menentukan skop di mana kod akan dilaksanakan.
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()) )
The Fungsi eval() biasanya membenarkan menilai ungkapan yang merujuk kepada pembolehubah atau pemalar yang ditentukan. Untuk mensimulasikan tingkah laku ini dalam Go, kami boleh memasukkan pemalar ke dalam skop penilaian.
// 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, })
Seterusnya, anda perlu menghuraikan ungkapan Go untuk dinilai dan mencipta AST (Pokok Sintaks Abstrak) untuknya. Sebaik sahaja anda mempunyai AST, anda boleh menilai ungkapan dengan bantuan pakej 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) }
Hasil penilaian akan disimpan dalam keputusan pembolehubah sebagai pemalar.Nilai. Anda boleh menukarnya kepada jenis yang dikehendaki mengikut keperluan. Dalam contoh anda, anda boleh mendapatkan hasil menggunakan:
intResult, ok := constant.Int64Val(result) if !ok { panic("failed to convert result to int") }
Dengan mengikuti langkah ini, anda boleh mencapai penilaian dinamik kod Go, serupa dengan fungsi eval() dalam JavaScript.
Atas ialah kandungan terperinci Adakah terdapat setara dengan fungsi `eval()` JavaScript untuk penilaian dinamik kod Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!