评估/执行像js'eval()这样的Golang代码/表达式

时间:2014-12-28 19:52:09

标签: go eval

golang上是否有类似eval()的方法?

评估/执行JavaScript代码/表达式:

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;

res的结果将是:

200
4
27

golang有可能吗?为什么?

6 个答案:

答案 0 :(得分:10)

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

看看:

您需要在包的范围内创建自己的PackageScope个对象以及Insert个常量。通过提供适当的类型信息,使用types.NewConst创建常量。

答案 1 :(得分:7)

  

golang有可能吗?为什么?

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

请注意,在Go中,与大多数其他编程语言一样,您可以编写自己的解释器,即一个接受字符串并使计算相应完成的函数。 Go设计师的选择只是不强迫每个不需要它的人都有这种可疑的兴趣和安全性。

答案 2 :(得分:3)

看看Github项目: https://github.com/novalagung/golpal

它允许运行更复杂的GO-Lang代码片段,但需要一个'temp'文件夹。

答案 3 :(得分:2)

没有内置评估版。但是可以实施符合GoLang规范大部分的评估:eval (only expression, not a code) package on github / on godoc

示例:

browser = webdriver.Chrome(...)
menu = browser.find_elements_by_xpath('//td[@onmouseover]')
for menu_part in menu:
try:
    if len(menu_part.text) < 2:
        menu_button = menu_part.find_element_by_xpath(
                    '/span[@class="ThemeOfficeMainFolderText"]/preceding-sibling::span/img').get_attribute('src')
    else:
        menu_button = menu_part.text
    print menu_button
except Exception as e:
    print e
    pass

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

答案 4 :(得分:0)

parsing示例在运行时解析GO代码:

package main

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

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

    src := `package foo

import (
    "fmt"
    "time"
)

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

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

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

}

答案 5 :(得分:0)

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

    Actions action = new Actions(driver);
    action.keyDown(keys.CONTROL);    
    action.sendKeys("c");
    action.keyUp(keys.CONTROL);
    action.build().perform(); // copy is performed
    
    action = new Actions(driver);
    action.keyDown(keys.CONTROL);
    action.sendKeys("v");
    action.keyUp(keys.CONTROL);
    action.build().perform(); // paste is performed