Rumah > pembangunan bahagian belakang > Golang > Adakah terdapat setara dengan fungsi `eval()` JavaScript untuk penilaian dinamik kod Go?

Adakah terdapat setara dengan fungsi `eval()` JavaScript untuk penilaian dinamik kod Go?

Linda Hamilton
Lepaskan: 2024-11-21 10:44:11
asal
913 orang telah melayarinya

Is there an equivalent to JavaScript's `eval()` function for dynamic evaluation of Go code?

Menilai Kod Go dengan eval()

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:

Membuat Pakej dan Skop

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())
)
Salin selepas log masuk

Memasukkan Pemalar ke dalam Skop

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,
})
Salin selepas log masuk

Menghuraikan dan Menilai Ungkapan

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)
}
Salin selepas log masuk

Keputusan dan Kesimpulan

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")
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan