基于 golang 原生语法解析器(parser)实现的轻量级规则引擎。支持操作:
- 规则匹配:
goparser.Match(ruleStr, params)
go get -u github.com/BeCrafter/go-parser@latestimport "github.com/BeCrafter/go-parser"
ruleStr := "!(a == 1 && b == 2 && c == "test" && d == false)"
// 匹配变量
params := map[string]interface{}{
"a": 1,
"b": 2,
"c": "test",
"d": true,
}
result, err := goparser.Match(ruleStr, params)
fmt.Println(result)import "github.com/BeCrafter/go-parser"
str = `{
"connector": "NOT",
"children": [
{
"connector": "AND",
"children": [
{
"op": "GE",
"value": 43,
"field": "age"
},
{
"op": "EQ",
"value": "haha",
"field": "name"
}
]
}
]
}`
var tmp map[string]interface{}
json.Unmarshal([]byte(str), &tmp)
if val, err := Expression(tmp); err != nil {
fmt.Errorf("goParser expression failed, err=%v", err)
}else{
fmt.Println("Expression:", val)
}import "github.com/BeCrafter/go-parser"
// MaxDemo 自定义Max函数
func MaxDemo(args []ast.Expr, data map[string]interface{}) interface{} {
num1 := goparser.Eval(args[0], data)
num2 := goparser.Eval(args[1], data)
if num1 > num2 {
return num1
}
return num2
}
// 在库中注册 `max` 函数
goparser.RegisterFunc("max", MaxDemo)- int
- int64
- string
- bool
!表达式:支持一元表达式&&:支持多个表达式逻辑与||:支持多个表达式逻辑或():支持表达式括号包裹==:int、int64、string、bool支持!=:int、int64、string、bool支持>:int、int64支持<:int、int64支持>=:int、int64支持<=:int、int64支持+:int、int64支持-:int、int64支持*:int、int64支持/:int、int64支持%:int、int64支持
Benchmarkgoparser_Match-8 127189 8912 ns/op // goparser
BenchmarkGval_Match-8 63584 18358 ns/op // gval
BenchmarkGovaluateParser_Match-8 13628 86955 ns/op // govaluate
BenchmarkYqlParser_Match-8 10364 112481 ns/op // yql