我将部分应用程序从PHP移到Go。我在MySQL中将一些代码存储到eval中,例如:checkGeo('{geo:["DE","AU","NL"]}') && check0s('{os:["android"]}')
。在PHP中它很容易,只有eval($stringToEval)
,但如何在Go lang中完成?
答案 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()
或类似的东西,结果将是次优的。因此,从安全角度来看,拥有一个原始的解析器/评估器也是一个好处。