Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > B站go规则引擎gengine

B站新一代 golang规则引擎gengine基础语法

作者:萧楚河

这篇文章主要为大家介绍了B站新一代 golang规则引擎gengine基础语法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

优势

对比droolsgengine
执行模式仅支持顺序模式支持顺序模式、并发模式、混合模式,以及其他细分执行模式
规则编写难易程度高,与java强相关低,自定义简单语法,与golang弱相关
规则执行性能低、无论是规则之间还是规则内部,都是顺序执行高,无论是规则间、还是规则内,都支持并发执行.用户基于需要来选择合适的执行模式

开源代码地址

https://github.com/bilibili/gengine

https://github.com/bilibili/gengine

语法

DSL语法

const rule = `
rule "rulename" "rule-describtion" salience  10
begin
//规则体
end`

如上,gengine DSL完整的语法块由如下几个组件构成:

规则体语法

规则体支持的运算

规则体支持的基础数据类型

不支持的特例

规则体支持的语法

其他语法大家如有需求可以去官方文档查看:

https://github.com/bilibili/gengine/wiki/%E8%AF%AD%E6%B3%95

使用案例

package test
import (
  "bytes"
  "fmt"
  "github.com/bilibili/gengine/builder"
  "github.com/bilibili/gengine/context"
  "github.com/bilibili/gengine/engine"
  "github.com/sirupsen/logrus"
  "io/ioutil"
  "strconv"
  "strings"
  "testing"
  "time"
)
//定义想要注入的结构体
type User struct {
  Name string
  Age  int64
  Male bool
}
func (u *User)GetNum(i int64) int64 {
  return i
}
func (u *User)Print(s string){
  fmt.Println(s)
}
func (u *User)Say(){
  fmt.Println("hello world")
}
//定义规则
const rule1 = `
rule "name test" "i can"  salience 0
begin
    if 7 == User.GetNum(7){
      User.Age = User.GetNum(89767) + 10000000
      User.Print("6666")
    }else{
      User.Name = "yyyy"
    }
end
`
func Test_Multi(t *testing.T){
  user := &User{
    Name: "Calo",
    Age:  0,
    Male: true,
  }
  dataContext := context.NewDataContext()
  //注入初始化的结构体
  dataContext.Add("User", user)
  //init rule engine
  ruleBuilder := builder.NewRuleBuilder(dataContext)
  start1 := time.Now().UnixNano()
    //构建规则
  err := ruleBuilder.BuildRuleFromString(rule1) //string(bs)
  end1 := time.Now().UnixNano()
  logrus.Infof("rules num:%d, load rules cost time:%d", len(ruleBuilder.Kc.RuleEntities), end1-start1 )
  if err != nil{
    logrus.Errorf("err:%s ", err)
  }else{
    eng := engine.NewGengine()
    start := time.Now().UnixNano()
        //执行规则
    err := eng.Execute(ruleBuilder,true)
    println(user.Age)
    end := time.Now().UnixNano()
    if err != nil{
      logrus.Errorf("execute rule error: %v", err)
    }
    logrus.Infof("execute rule cost %d ns",end-start)
    logrus.Infof("user.Age=%d,Name=%s,Male=%t", user.Age, user.Name, user.Male)
  }
}

示例解释

小技巧

如果大家对设计实现比较感兴趣可以通过如下地址查看:

//www.jb51.net/jiaoben/284935hzu.htm

以上就是B站新一代 golang规则引擎gengine基础语法的详细内容,更多关于B站go规则引擎gengine的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文