当前位置: 首页 > 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
}
http://www.lqws.cn/news/118603.html

相关文章:

  • Python爬虫:trafilatura 的详细使用(高效的网页正文提取工具)
  • Vue3+Vite中lodash-es安装与使用指南
  • 共识机制全景图:PoW、PoS 与 DAG 的技术对比
  • NFT 市场开发:基于 Ethereum 和 IPFS 构建去中心化平台
  • 正则表达式检测文件类型是否为视频或图片
  • 实时通信RTC与传统直播的异同
  • HashMap中的put方法执行流程(流程图)
  • 【免杀】C2免杀技术(十五)shellcode混淆uuid/ipv6/mac
  • 微软重磅发布Magentic UI,交互式AI Agent助手实测!
  • SQL 中 JOIN 的执行顺序优化指南
  • 神经网络-Day44
  • 根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
  • Python爬虫爬取天猫商品数据,详细教程【Python经典实战项目】
  • SpringAI(GA):Nacos2下的分布式MCP
  • 【25软考网工】第十章 网络规划与设计(1)综合布线
  • 基于Axure+墨刀设计的电梯管理系统云台ERP的中保真原型图
  • [Java 基础]注释
  • 生成式AI驱动的智能采集实战
  • NeRF PyTorch 源码解读 - NDC空间
  • Linux容器篇、第一章_01Linux系统下 Docker 安装与镜像部署全攻略
  • 回归分析-非线性回归及岭回归.docx
  • LabVIEW的MathScript Node 绘图功能
  • OpenCV C++ 学习笔记(六):绘制文本、几何绘图、查找/绘制轮廓
  • HRI-2025 | 大模型驱动的个性化可解释机器人人机交互研究
  • 中国区域30m/15天植被覆盖度数据集(2010-2022)
  • [论文阅读]PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning
  • 隐藏层-机器学习
  • TongNCS 控制台没有显示验证码的解决方案(by sy+lqw)
  • 某校体育场馆结构自动化监测
  • Axios学习笔记