当前位置: 首页 > news >正文

go的工具库:github.com/expr-lang/expr

github.com/expr-lang/expr 是一个 Go 语言的表达式求值库,它允许你在运行时安全地执行表达式。主要用途包括:

1.表达式求值:

program, err := expr.Compile("2 + 2")
if err != nil {// 处理错误
}
result, err := expr.Run(program, nil)
// result 将是 4

2.条件表达式

program, err := expr.Compile("age > 18 && name == 'John'")
if err != nil {// 处理错误
}
result, err := expr.Run(program, map[string]interface{}{"age": 20,"name": "John",
})
// result 将是 true

3.复杂表达式

program, err := expr.Compile("sum(numbers) > 100 && len(numbers) > 0")
if err != nil {// 处理错误
}
result, err := expr.Run(program, map[string]interface{}{"numbers": []int{1, 2, 3, 4, 5},"sum": func(numbers []int) int {sum := 0for _, n := range numbers {sum += n}return sum},
})

主要特点:
安全性:表达式在沙箱环境中执行
性能:编译后的表达式执行速度快
灵活性:支持自定义函数和变量
类型安全:支持类型检查

常见用途:
规则引擎
配置验证
动态条件判断
数据过滤
业务规则执行
例如,在配置验证中:

type Config struct {MaxSize intMinSize int
}config := Config{MaxSize: 100, MinSize: 10}
program, err := expr.Compile("MaxSize > MinSize")
if err != nil {// 处理错误
}
result, err := expr.Run(program, config)
if err != nil {// 处理错误
}
if !result.(bool) {// 配置无效
}

在业务规则中:

type Order struct {Amount float64Items  int
}order := Order{Amount: 100, Items: 5}
program, err := expr.Compile("Amount > 50 && Items > 0")
if err != nil {// 处理错误
}
result, err := expr.Run(program, order)
if err != nil {// 处理错误
}
if result.(bool) {// 订单有效
}

使用注意事项

expr.Compile 方法的性能和使用注意事项如下:
1.编译性能:

// 编译性能
program, err := expr.Compile("2 + 2")

编译时间通常很短,在微秒级别
但对于复杂表达式,编译时间会相应增加
建议缓存编译结果,避免重复编译

2.缓存编译结果:

// 使用 sync.Map 缓存编译结果
var compiledExpressions sync.Mapfunc getCompiledExpression(expr string) (*expr.Program, error) {// 先查找缓存if cached, ok := compiledExpressions.Load(expr); ok {return cached.(*expr.Program), nil}// 编译新表达式program, err := expr.Compile(expr)if err != nil {return nil, err}// 存入缓存compiledExpressions.Store(expr, program)return program, nil
}

3.错误处理:

// 完整的错误处理
program, err := expr.Compile("invalid expression")
if err != nil {switch e := err.(type) {case *expr.Error:// 处理表达式错误log.Printf("Expression error: %v", e)default:// 处理其他错误log.Printf("Unexpected error: %v", e)}return
}

4.类型安全:

// 使用类型检查
env := map[string]interface{}{"age": 20,"name": "John",
}// 编译时进行类型检查
program, err := expr.Compile("age > 18 && name == 'John'", expr.Env(env))
if err != nil {// 处理类型错误return
}

5.并发安全:

// 使用互斥锁保护缓存
var (cache     = make(map[string]*expr.Program)cacheLock sync.RWMutex
)func getCompiledExpression(expr string) (*expr.Program, error) {cacheLock.RLock()if program, ok := cache[expr]; ok {cacheLock.RUnlock()return program, nil}cacheLock.RUnlock()cacheLock.Lock()defer cacheLock.Unlock()program, err := expr.Compile(expr)if err != nil {return nil, err}cache[expr] = programreturn program, nil
}

相关文章:

  • 突破数据孤岛:StarRocks联邦查询实战指南
  • 【发布实录】云原生+AI,助力企业全球化业务创新
  • Java设计模式:责任链模式
  • Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit
  • 数据结构第一章
  • 【RAG优化】rag整体优化建议
  • [ Qt ] | 与系统相关的操作(二):键盘、定时器、窗口移动和大小
  • 跟着deepseek浅学分布式事务(2) - 两阶段提交(2PC)
  • yum更换阿里云的镜像源
  • 保险丝选型
  • 树莓派系列教程第九弹:Cpolar内网穿透搭建NAS
  • 云数据库选型指南:关系型 vs NoSQL vs NewSQL的企业决策
  • 【开源工具】 黑客帝国系列系统监控工具:基于PyQt5的全方位资源监控系统
  • 【Linux】编译器gcc/g++及其库的详细介绍
  • 【从GEO数据库批量下载数据】
  • Python训练打卡Day42
  • YOLOv1 到 YOLOv12汇总信息2025.6.4
  • Python绘图库及图像类型
  • [Linux] Linux GPIO应用编程深度解析与实践指南(代码示例)
  • Flutter如何支持原生View
  • 牛商网做网站/厦门关键词优化平台
  • 织梦做网站简单吗/网站seo优化步骤
  • 南京网站制作/开发一个app需要多少钱?
  • 做网站内容软件/直播营销策划方案范文
  • 做网站的联系方式/nba最新交易新闻
  • 网站建设的产品类型是什么/webview播放视频