go - 使用 govaluate 比较表达式中的日期值

标签 go expression rule-engine

我正在尝试使用 govaluate 构建规则引擎:https://github.com/Knetic/govaluate

这是我的代码:

package main

import (
    "github.com/Knetic/govaluate"
    "fmt"
)

func main()  {
    expression, err := govaluate.NewEvaluableExpression("first_name == 'Julian' && emp_id == 302 && birth_date >= '2016-12-12' && birth_date <= '2016-12-25'")

    parameters := make(map[string]interface{}, 8)
    parameters["first_name"] = "Julian"
    parameters["emp_id"] = 302
    parameters["birth_date"] = "2016-12-15"
    result, err := expression.Evaluate(parameters)

    if err != nil {
        fmt.Println("Error while evaluating the expression")
    }

    if result.(bool) {
        fmt.Println("Condition is evaluated to true")
    } else {
        fmt.Println("Condition is evaluated to false")
    }
}

在浏览 govaluate Types 文档 ( https://github.com/Knetic/govaluate/blob/master/MANUAL.md ) 时,我注意到这个语句“任何可解释为日期的字符串文字(不是参数)将被转换为该日期的 unix 时间的 float64 表示。

当我执行上面的程序时,我看到一个结果为空的问题:

Error while evaluating the expression
panic: interface conversion: interface is nil, not bool

我的问题是日期值是否可以作为参数传入?因为我想在运行时比较日期值,所以需要此功能。

有什么办法可以实现吗?可能是我的使用模式是错误的。请提出建议。

编辑:

expression, err := govaluate.NewEvaluableExpression("first_name == 'Julian' && emp_id == 302 && birth_date >= '2016-12-12' && birth_date <= '2016-12-25'")
dateFloat, _ := strconv.ParseFloat("2016-12-15", 64)
parameters["birth_date"] = dateFloat
result, err := expression.Evaluate(parameters)

将日期更改为浮点格式并调用 Evaluate 函数。现在条件被评估为假。但从逻辑上讲,2016-12-15 介于 2016-12-12 和 2016-12-25 之间。该表达式应评估为真。

提前致谢!

最佳答案

交叉发布我在 the associated github issue 中的回答, 对于 future 的谷歌员工;

该库不会尝试将字符串参数解析为日期 - 它预计 birth_date 将是 Unix()该日期的值(value)。这意味着您必须先解析日期,然后再将其传递给 govaluate。

如果您将 birth_date 作为 REST api 的一部分,我建议您选择一种特定的日期格式(例如 ISO8601)并执行类似以下操作:

var birthDateString string // <-- the birth_date string you get from the request

iso8601 := "2006-01-02T15:04:05Z0700"

birthDate, err := time.ParseInLocation(iso8601, birthDateString, 
time.Local)
parameters["birth_date"] = birthDate.Unix()

关于go - 使用 govaluate 比较表达式中的日期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893202/

相关文章:

go - 如何检查错误类型?

go - 如何从 Go 二进制文件中捕获代码覆盖率?

.net-4.0 - Lambda表达式-根据对象集合中另一个属性的值设置该对象集合中一个属性的值

entity-framework - 如何包含检查属性及其值的 And() 表达式

python - 生成器表达式在 python 内部如何工作?

java - 推理引擎根据内部规则计算匹配集

go - 将 map 作为值传递到 Cassandra 中

regex - 去,正则表达式 : to match either case and keep the original text

java - Drools 嵌套聚合

junit - 使用junit进行Drools测试