概述
Expr 是一个专为 Go 语言设计的表达式求值库,旨在通过简洁的语法实现动态配置、业务规则和条件判断。它强调安全性(内存安全、无副作用、无死循环)、高性能(基于字节码虚拟机优化)和无缝 Go 集成(直接复用 Go 类型,静态类型检查)。
核心特性
- 安全性优先 
 • 内存安全:禁止访问无关内存,避免潜在漏洞。
 • 无副作用:表达式仅依赖输入计算输出,不修改外部状态。
 • 强制终止:防止无限循环,确保表达式执行可控。
- 深度集成 Go 生态 
 • 无需类型重定义:直接使用已有的 Go 结构体、函数作为表达式环境变量。
 • 静态类型检查:编译阶段捕获类型错误(如- string + int直接报错)。
- 高性能设计 
 • 优化编译器 + 字节码虚拟机,适用于高频调用场景(如实时规则引擎)。
- 开发友好 
 • 丰富的内置函数(- all、- filter、- map等)和操作符。
 • 清晰的错误提示,快速定位语法或逻辑问题。
快速上手
安装:
| 1 | go get github.com/expr-lang/expr | 
示例 1:动态字符串生成
| 1 | env := map[string]interface{}{ | 
示例 2:业务规则验证
| 1 | type Tweet struct{ Len int } | 
适用场景
- 动态业务规则(如 Uber Eats 的商家配置、Wish 的促销规则)
- 实时条件判断(如游戏匹配算法、风控系统)
- 配置验证(如 K8s 资源策略、网络流分类)
- 交互式工具(如 REPL 环境、DSL 实现)
谁在使用?
• Uber、GoDaddy:动态配置电商/服务策略
• ByteDance、Aviasales:业务规则引擎
• Argo Rollouts、CoreDNS:基础设施逻辑控制
• Chaos Mesh、CrowdSec:安全与混沌工程  
总结
Expr 凭借其安全性、性能和Go 原生友好性,成为动态规则场景的优选方案。若你的项目需要灵活表达式求值(如用户自定义条件、实时策略调整),Expr 能以极低成本接入,避免重复造轮子的同时保障代码健壮性。