不废话,直接上 demo,实际应用中需要考虑的因素比较多,结合具体情况吧。
这边由于基础平台没有广告系统,所以自己使用 expr 做个通用的规则系统。
package main
import (
"fmt"
"time"
"github.com/antonmedv/expr"
"github.com/antonmedv/expr/vm"
)
func main() {
var programs []*vm.Program
for _, ruleExpr := range ruleExprList {
p1, err := expr.Compile(ruleExpr, expr.Env(ruleFunc))
if err != nil {
fmt.Println(err)
continue
}
programs = append(programs, p1)
}
for _, program := range programs {
ruleFunc.RequestContext = RequestContext{Time: time.Now()}
output, err := vm.Run(program, ruleFunc)
fmt.Println("run:", output, err)
}
}
var ruleExprList = []string{
"NowStr(RequestContext)",
"Config.Id",
}
var ruleFunc = &RuleContext{
NowStr: Now,
Config:Config,
}
type RuleContext struct {
RequestContext
NowStr func(RequestContext) interface{}
Config map[string]int64
}
type RequestContext struct {
time.Time
}
func Now(req RequestContext) interface{} {
return req.Time
}
var Config = map[string]int64{
"Id":111,
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于