Eval片段作为字符串存储在DB中

时间:2014-03-23 12:55:34

标签: php go

我将部分应用程序从PHP移到Go。我在MySQL中将一些代码存储到eval中,例如:checkGeo('{geo:["DE","AU","NL"]}') && check0s('{os:["android"]}')。在PHP中它很容易,只有eval($stringToEval),但如何在Go lang中完成?

3 个答案:

答案 0 :(得分:3)

在像PHP这样的解释语言中,实现eval非常简单。但Go是一种编译语言。要在Go中实现eval,需要为Go编写一个解释器。这不是不可能的,但这将是一项重大工作。

- 编辑
您可以查看https://godoc.org/bitbucket.org/binet/go-eval/pkg/eval哪些可能符合您的要求。如果没有,那么你可以稍微扩展一下。但它并不是一个完整的翻译。

答案 1 :(得分:1)

基于您给出的示例,似乎很容易构建一些知道如何评估checkGeo()或checkOs()规则的go代码;我认为这是最好的方法。

但那不是你问的......

另一种选择是在Lua中编写规则并使用https://github.com/aarzilli/golua或Javascript运行它们并使用https://github.com/robertkrimen/otto

答案 2 :(得分:1)

你不需要为这类事情提供一个完整的解释器:编写一个简单的解析器,将你的脚本分开到语法树中,然后编写将遍历该树和&的代码#34;评价"它。对于像你这样的简单案例来说, 当然,您的语法可能比PHP更简单,因为您不需要PHP评估员的全部功能。

一个简单的例子是rpn,但你可以更简单,并发明一种方法来存储你的查询,比如JSON。

另请注意,Go有一个Go解析器形式的Go解析器 - go/parser,因此您可以使用(minimal)Go语法编写查询,使用go/parser解析它们并仅实现评估程序它将遍历解析器生成的AST并计算结果。但考虑到你所提供的例子,我认为这将是一种过度训练。

还有一个小小的挑剔:存储将由完整的评估者(如PHP)评估的代码是危险的:如果有人设法在你的表中注入exec()或类似的东西,结果将是次优的。因此,从安全角度来看,拥有一个原始的解析器/评估器也是一个好处。