评估/执行 Golang 代码/表达式,类似于 JavaScript 的 eval() 函数。

huangapple go评论91阅读模式
英文:

Evaluate/Execute Golang code/expressions like js' eval()

问题

在Go语言中是否有类似eval()的方法?

在Go语言中,没有类似eval()的方法。eval()方法通常用于执行动态生成的代码或表达式,但Go语言的设计目标是安全性和静态类型检查,因此没有提供eval()函数。相反,Go语言鼓励使用静态类型和编译时检查来确保代码的安全性和可靠性。如果需要执行动态代码,可以考虑使用Go语言的插件系统或者调用其他支持动态执行的语言的解释器。

英文:

Is there a eval() like method on golang?

Evaluate/Execute JavaScript code/expressions:

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;

The result of res will be:

200
4
27

Is this possible in golang? and why?

答案1

得分: 20

完全有可能。至少对于表达式来说,这似乎是你想要的:

请查看以下链接:

你需要创建自己的PackageScope对象,并将常量Insert到包的作用域中。可以使用types.NewConst来创建常量,提供适当的类型信息。

英文:

Its perfectly possible. At least for expressions, which seems to be what you want:

Have a look at:

You'd need to create your own Package and Scope objects and Insert constants to the package's scope. Constants are created using types.NewConst by providing appropriate type information.

答案2

得分: 15

这在golang中是可能的吗?为什么?

不,因为golang不是那种类型的语言。它旨在进行编译,而不是解释,因此运行时不包含任何“字符串到代码”转换器,也不知道什么是语法正确的程序。

请注意,在Go语言中,就像大多数其他编程语言一样,您可以编写自己的解释器,即一个接受字符串并相应地执行计算的函数。Go设计者的选择只是不强制将这种具有可疑兴趣和安全性的特性强加给不需要它的每个人。

英文:

> Is this possible in golang? and why?

No, because golang is not that kind of language. It is intended to be compiled, not interpreted, so that the runtime does not contain any “string to code” transformer, or indeed knows what a syntactically correct program looks like.

Note that in Go as in most other programming languages, you can write your own interpreter, that is, a function that takes a string and causes computations to be done accordingly. The choice of the Go designers is only not to force a feature of such dubious interest and security on everyone who did not need it.

答案3

得分: 4

没有内置的eval函数。但是可以实现一个遵循大部分Go语言规范的评估函数。可以在GitHub上找到一个实现了评估函数的包:eval (仅支持表达式,不支持代码) package on github / on godoc

示例代码:

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"

在评估的表达式中也可以使用变量,但需要将它们的名称与值一起传递给Eval方法。

英文:

There is no built-in eval. But it is possible to implement evaluation which will follow most of GoLang spec: eval (only expression, not a code) package on github / on godoc.

Example:

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"

It is also possible to use variables in evaluated expression, but it requires pass them with theirs names to Eval method.

答案4

得分: 1

这个 parsing 示例在运行时解析 GO 代码:
<!-- language: lang-go -->

package main

import (
	"fmt"
	"go/parser"
	"go/token"
)

func main() {
	fset := token.NewFileSet() // 位置相对于 fset

	src := `package foo

import (
	"fmt"
	"time"
)

func bar() {
	fmt.Println(time.Now())
}`

	// 解析 src,但在处理导入语句后停止。
	f, err := parser.ParseFile(fset, "", src, parser.ImportsOnly)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 打印文件的 AST 中的导入语句。
	for _, s := range f.Imports {
		fmt.Println(s.Path.Value)
	}

}
英文:

This parsing example parses GO code at runtime:
<!-- language: lang-go -->

package main

import (
	&quot;fmt&quot;
	&quot;go/parser&quot;
	&quot;go/token&quot;
)

func main() {
	fset := token.NewFileSet() // positions are relative to fset

	src := `package foo

import (
	&quot;fmt&quot;
	&quot;time&quot;
)

func bar() {
	fmt.Println(time.Now())
}`

	// Parse src but stop after processing the imports.
	f, err := parser.ParseFile(fset, &quot;&quot;, src, parser.ImportsOnly)
	if err != nil {
		fmt.Println(err)
		return
	}

	// Print the imports from the file&#39;s AST.
	for _, s := range f.Imports {
		fmt.Println(s.Path.Value)
	}

}

答案5

得分: 0

go-exprtk 包可以满足您动态评估任何类型的数学表达式的各种需求。

package main

import (
	"fmt";

	"github.com/Pramod-Devireddy/go-exprtk"
)

func main() {
	exprtkObj := exprtk.NewExprtk()

	exprtkObj.SetExpression("x * y")

	exprtkObj.AddDoubleVariable("x")
	exprtkObj.AddDoubleVariable("y")

	exprtkObj.CompileExpression()

	exprtkObj.SetDoubleVariableValue("x", 10)
	exprtkObj.SetDoubleVariableValue("y", 20)

	a := exprtkObj.GetEvaluatedValue()
    
    exprtkObj.SetExpression("2 + 2")
    exprtkObj.CompileExpression()

    b := exprtkObj.GetEvaluatedValue()

    exprtkObj.SetExpression("x + 17")
    exprtkObj.CompileExpression()

    c := exprtkObj.GetEvaluatedValue()

    res := a + b + c

    fmt.Println(a, b, c, res)
}

英文:

go-exprtk package will probably meet all kinds of your needs to evaluate any kind of mathematical expression dynamically.

package main

import (
	&quot;fmt&quot;

	&quot;github.com/Pramod-Devireddy/go-exprtk&quot;
)

func main() {
	exprtkObj := exprtk.NewExprtk()

	exprtkObj.SetExpression(&quot;x * y&quot;)

	exprtkObj.AddDoubleVariable(&quot;x&quot;)
	exprtkObj.AddDoubleVariable(&quot;y&quot;)

	exprtkObj.CompileExpression()

	exprtkObj.SetDoubleVariableValue(&quot;x&quot;, 10)
	exprtkObj.SetDoubleVariableValue(&quot;y&quot;, 20)

	a := exprtkObj.GetEvaluatedValue()
    
    exprtkObj.SetExpression(&quot;2 + 2&quot;)
    exprtkObj.CompileExpression()

    b := exprtkObj.GetEvaluatedValue()

    exprtkObj.SetExpression(&quot;x + 17&quot;)
    exprtkObj.CompileExpression()

    c := exprtkObj.GetEvaluatedValue()

    res := a + b + c

    fmt.Println(a, b, c, res)
}

huangapple
  • 本文由 发表于 2014年12月29日 03:52:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/27680042.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定