2014-12-28 13 views
5

Có phương thức eval() giống như trên golang không?Đánh giá/Thực thi mã/biểu thức Golang như js 'eval()

Đánh giá/Execute mã JavaScript/biểu thức:

var x = 10; 
var y = 20; 
var a = eval("x * y") + "<br>"; 
var b = eval("2 + 2") + "<br>"; 
var c = eval("x + 17") + "<br>"; 

var res = a + b + c; 

Kết quả của res sẽ là:

200 
4 
27 

Đây có phải là có thể trong golang? và tại sao?

Trả lời

5

Điều này có thể thực hiện được ở golang không? và tại sao?

Không, vì golang không phải là loại ngôn ngữ đó. Nó được thiết kế để được biên dịch, không được giải thích, do đó, thời gian chạy không chứa bất kỳ biến "chuỗi để mã", hoặc thực sự biết những gì một chương trình cú pháp chính xác như thế nào. Lưu ý rằng trong Go như trong hầu hết các ngôn ngữ lập trình khác, bạn có thể viết trình thông dịch của riêng bạn, nghĩa là, một hàm nhận chuỗi và khiến các tính toán được thực hiện tương ứng. Sự lựa chọn của các nhà thiết kế Go chỉ là không ép buộc một tính năng quan tâm và an ninh đáng ngờ như vậy đối với tất cả những người không cần nó.

6

Hoàn toàn có thể. Ít nhất cho các biểu thức, mà có vẻ là những gì bạn muốn:

Có một cái nhìn tại địa chỉ:

https://golang.org/src/go/types/eval.go

https://golang.org/src/go/constant/value.go

https://golang.org/pkg/go/types/#Scope

Bạn sẽ cần phải tạo riêng của bạn PackageScope đối tượng và Insert hằng số vào phạm vi của gói. Các hằng số được tạo bằng cách sử dụng types.NewConst bằng cách cung cấp thông tin loại thích hợp.

2

Không có eval tích hợp. Nhưng có thể thực hiện đánh giá mà sẽ theo hầu hết các thông số của GoLang: eval (only expression, not a code) package on github/on godoc.

Ví dụ:

import "github.com/apaxa-go/eval" 
... 
src:="int8(1*(1+2))" 
expr,err:=eval.ParseString(src,"") 
if err!=nil{ 
    return err 
} 
r,err:=expr.EvalToInterface(nil) 
if err!=nil{ 
    return err 
} 
fmt.Printf("%v %T", r, r) // "3 int8" 

Nó cũng có thể sử dụng các biến trong biểu đánh giá, nhưng nó đòi hỏi vượt qua chúng bằng tên của họ với phương pháp Eval.

+0

eval gói được liên kết tại đây không còn được duy trì –

Các vấn đề liên quan