今天给大家介绍一个比较好玩的库,今天在看别人写的代码的时候发现在代码中用到了govaluate库,这个库可以让我们在golang代码中计算一个表达式的结果,这让我们在实现一些条件判断业务场景的时候非常便利。govaluate
与 JavaScript 中的eval
功能类似,用于计算任意表达式的值。此类功能函数在 JavaScript/Python 等动态语言中比较常见。govaluate
让 Go 这个编译型语言也有了这个能力!
-
- $ go get github.com/Knetic/govaluate
- package main
-
- import (
- "fmt"
- "github.com/Knetic/govaluate"
- "log"
- )
-
- func main() {
-
- // 简单表达式 无参数
- expr, err := govaluate.NewEvaluableExpression("10>0")
- if err != nil {
- log.Fatal("syntax error:",err)
- }
- result, err := expr.Evaluate(nil)
- if err != nil {
- log.Fatal("evaluate error:err")
- }
- fmt.Println(result)
- }
使用govaluate
计算表达式只需要两步:
NewEvaluableExpression()
将表达式转为一个表达式对象;Evaluate
方法,传入参数,返回表达式的值。上面演示了一个很简单的例子,我们使用govaluate
计算10 > 0
的值,该表达式不需要参数,故传给Evaluate()
方法nil
值。当然,这个例子并不实用,显然我们直接在代码中计算10 > 0
更简单。但问题是,有些时候我们并不知道需要计算的表达式的所有信息,甚至我们都不知道表达式的结构。这时govaluate
的作用就体现出来了。
govaluate
支持在表达式中使用参数,调用表达式对象的Evaluate()
方法时通过map[string]interface{}
类型将参数传入计算。其中map
的键为参数名,值为参数值。例如:
- package main
-
- import (
- "fmt"
- "github.com/Knetic/govaluate"
- )
-
- func main() {
-
- expr1, _ := govaluate.NewEvaluableExpression("foo >0")
- param:= make(map[string]interface{})
- param["foo"] = -1
- r1, _ := expr1.Evaluate(param)
- fmt.Printf("r1:%+v\n",r1)
-
- expr2, _ := govaluate.NewEvaluableExpression("