GO Govaluate

govaluate 是一个用于在 Go 语言中动态求值表达式的库。它允许你解析和评估字符串形式的表达式,这些表达式可以包含变量、函数以及逻辑、算术和比较操作。它非常适合在运行时处理复杂的逻辑规则和条件表达式,而不需要重新编译代码。

安装 govaluate

go get github.com/Knetic/govaluate

基本使用

govaluate 的核心是 Evaluate 方法,它接受表达式字符串和变量值,并返回计算结果。

1. 简单表达式求值
package mainimport ("fmt""github.com/Knetic/govaluate"
)func main() {expression, _ := govaluate.NewEvaluableExpression("10 > 5")result, _ := expression.Evaluate(nil)fmt.Println(result) // 输出: true
}
2. 带变量的表达式求值
package mainimport ("fmt""github.com/Knetic/govaluate"
)func main() {expression, _ := govaluate.NewEvaluableExpression("foo + 10 > 20")parameters := map[string]interface{}{"foo": 15,}result, _ := expression.Evaluate(parameters)fmt.Println(result) // 输出: true
}
3. 带自定义函数的表达式

你可以将自定义的函数传递给 govaluate 以供表达式使用。

package mainimport ("fmt""math""github.com/Knetic/govaluate"
)func main() {expression, _ := govaluate.NewEvaluableExpression("sqrt(foo) + 10")parameters := map[string]interface{}{"foo": 16,"sqrt": func(args ...interface{}) (interface{}, error) {val := args[0].(float64)return math.Sqrt(val), nil},}result, _ := expression.Evaluate(parameters)fmt.Println(result) // 输出: 14
}

你可以利用 govaluate 库来封装一个匹配位的函数,允许你动态传入表达式来判断某个 uint16 数字的某一位是否为 1。通过 govaluate,你可以将表达式解析成动态逻辑,从而更加灵活地使用这个函数。

使用 govaluate 封装位匹配函数

以下是一个示例,展示如何通过 govaluate 封装一个检查 uint16 的某一位是否设置为 1 的函数:

package mainimport ("fmt""github.com/Knetic/govaluate"
)// CheckBitSetUsingExpression 使用 govaluate 动态评估表达式来检查位
func CheckBitSetUsingExpression(num uint16, pos uint) (bool, error) {if pos > 15 {return false, fmt.Errorf("pos 超出 uint16 范围")}// 构建表达式,检查位是否为 1expressionStr := fmt.Sprintf("num & (1 << pos) != 0")// 编译表达式expression, err := govaluate.NewEvaluableExpression(expressionStr)if err != nil {return false, err}// 设置变量parameters := map[string]interface{}{"num": num,"pos": pos,}// 计算表达式result, err := expression.Evaluate(parameters)if err != nil {return false, err}return result.(bool), nil
}func main() {var num uint16 = 0b1010101010101010 // 示例的 16 位数pos := uint(3)                     // 要检查的位位置result, err := CheckBitSetUsingExpression(num, pos)if err != nil {fmt.Println("错误:", err)return}if result {fmt.Printf("位 %d 是 1\n", pos)} else {fmt.Printf("位 %d 是 0\n", pos)}
}
代码说明:
  1. 表达式字符串

    • expressionStr := fmt.Sprintf("num & (1 << pos) != 0"):构建表达式,动态判断某个数字的某一位是否为 1。
  2. 使用 govaluate 评估表达式

    • expression, err := govaluate.NewEvaluableExpression(expressionStr):使用 govaluate 创建一个可评估的表达式。
    • parameters := map[string]interface{}{...}:将 numpos 作为参数传递给表达式。
    • result, err := expression.Evaluate(parameters):评估表达式并获取结果。
  3. 结果判断

    • 通过 result.(bool) 将评估结果转换为布尔值,以判断位是否为 1。
使用场景:
  • 通过这种封装,你可以动态构建和评估复杂的位运算表达式,而无需硬编码具体的逻辑。
  • 表达式可以根据需求修改,比如处理不同的数据类型或执行不同的位操作。

通过 govaluate,你可以灵活地处理更多动态逻辑和表达式,使你的代码更加灵活和可扩展。

使用场景
  1. 动态规则引擎

    • 在某些业务场景中,你可能需要灵活地定义和调整规则,比如优惠活动、权限控制等,使用硬编码实现这些规则可能不够灵活。govaluate 允许你通过表达式定义规则,运行时动态求值。
  2. 配置驱动的业务逻辑

    • 某些配置文件或数据库字段可能存储逻辑表达式,通过 govaluate 可以直接从配置中加载并求值,而不需要手动解析和处理复杂的逻辑。
  3. 监控和告警系统

    • 例如在监控系统中,你可以动态地定义阈值条件,当某个数值超出某个阈值时触发告警。表达式可以通过 govaluate 动态计算和评估。
  4. 游戏开发中的事件驱动

    • 在游戏逻辑中,你可以允许用户或开发者定义某些条件,比如触发某种事件的条件(如玩家得分超过一定值)。通过 govaluate 这种条件可以轻松动态评估。
  5. 表单校验和数据验证

    • 你可以使用 govaluate 来动态定义校验规则,并在表单提交时根据这些规则对数据进行校验。
优点
  • 灵活性:允许你在运行时定义和求值表达式,不需要重新编译代码。
  • 可扩展性:支持自定义函数扩展表达式的功能。
  • 解析支持:支持复杂的表达式解析,包括逻辑运算、算术运算、比较运算等。
注意事项
  • 性能:govaluate 需要解析和评估字符串表达式,因此在性能要求高的场景中,需要考虑其开销。
  • 安全性:确保用户输入的表达式是可信的,避免在表达式中执行恶意逻辑。

govaluate 非常适合用于需要灵活规则和动态求值的场景,尤其是在业务规则频繁变化或需要用户自定义逻辑的系统中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC中使用REST风格

了解REST REST&#xff1a;即 Representational State Transfer。&#xff08;资源&#xff09;表现层状态转化。是目前最流行的一种互联网软件架构。使用这种架构的应用即为RESTFUL。它结构清晰、符合标准、易于理解、扩展方便&#xff0c; 所以正得到越来越多网站的采用。 …

【练习9】大数加法

链接&#xff1a;大数加法__牛客网 (nowcoder.com) 分析&#xff1a; 当作竖式计算 import java.util.*;public class Solution {public String solve (String s, String t) {StringBuffer ret new StringBuffer();//i是字符串s的最后一个字符的索引int i s.length() - 1;//j…

新能源汽车安全问题如何解决?细看“保护罩”连接器的守护使命

「当前市场上绝大部分电池的安全系数远远不够」。 在一场世界动力电池大会上&#xff0c;宁德时代的董事长曾毓群这样犀利直言。 从汽车开始向电动化转型升级那天起&#xff0c;动力电池的安全隐患就一直是个老生常谈的话题了。曾毓群的这句话&#xff0c;直接点明了行业的发展…

参数传了报错没传参数识别不到参数传丢

【记一次参数传值了但报错未传值的问题解决历程】 问题描述&#xff1a;同一个接口&#xff0c;用测试类调可以成功&#xff0c;用postman调用一直报错少参数&#xff0c;后又尝试了用idea自带的http调用&#xff0c;同样报错参数未传值。 如图&#xff0c;传值了报错未传值。…

Java并发:互斥锁,读写锁,Condition,StampedLock

3&#xff0c;Lock与Condition 3.1&#xff0c;互斥锁 3.1.1&#xff0c;可重入锁 锁的可重入性&#xff08;Reentrant Locking&#xff09;是指在同一个线程中&#xff0c;已经获取锁的线程可以再次获取该锁而不会导致死锁。这种特性允许线程在持有锁的情况下&#xff0c;可…

AI网盘搜索 1.2.6 智能文件搜索助手,一键搜索所有资源

对于经常需要处理大量文件的人来说&#xff0c;AI网盘检索简直是救星。它提供了智能对话式搜索功能&#xff0c;只需用自然语言描述就能找到需要的文件。此外&#xff0c;它还广泛支持各种文件类型&#xff0c;从文档到图片&#xff0c;全面覆盖。精准定位功能让您能够快速找到…

DSC+主备+异步备库搭建

DSC主备异步备库搭建 本次在DSC的基础上进行主备集群异步备库的搭建&#xff0c;实现DSC主备异步备库的集合。 这里DMDSC集群是看做一个数据库服务&#xff08;即DSC集群内的都叫主库&#xff09;&#xff0c;备库是一个单机实例 环境配置 服务器配置 端口配置 实例名PORT…

C#获取计算机信息

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; n…

Vulnhub:bassamCTF

靶机下载地址 信息收集 主机发现 扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.165 端口扫描 nmap 192.168.31.165 -A -p- -T4 开放端口22&#xff0c;80。 网站信息收集 访问80端口的http服务。首页是空白页面&#xff0c;…

关于打不开SOAMANAGER如何解决

参考文章&#xff1a;https://blog.csdn.net/yannickdann/article/details/115396035 打开SE93

15_分布式数据结构

菜鸟&#xff1a; 老鸟&#xff0c;我最近在处理大量数据的时候遇到了瓶颈&#xff0c;单台服务器的内存和计算能力都不够用了。你知道有什么方法可以解决这个问题吗&#xff1f; 老鸟&#xff1a; 嗯&#xff0c;这种情况很常见。你可以考虑使用分布式数据结构。听说过吗&a…

ARM base instruction -- blr

BLR Branch with Link to Register calls a subroutine at an address in a register, setting register X30 to PC4. 带寄存器链接的分支在寄存器中的某个地址调用一个子程序&#xff0c;将寄存器 X30 (lr) 设置为 PC4。 BLR <Xn> BLR 跳转到reg内容地址&#xff0c;…

Django创建模型

1、根据创建好应用模块 python manage.py startapp tests 2、在models文件里创建模型 from django.db import modelsfrom book.models import User# Create your models here. class Tests(models.Model):STATUS_CHOICES ((0, 启用),(1, 停用),# 更多状态...)add_time mode…

大模型训练数据库Common Crawl

Common Crawl介绍 ‌‌Common Crawl是一个非营利组织&#xff0c;致力于通过大规模分布式爬虫系统定期抓取整个Web并将其存储在一个可公开访问的数据库中。Common Crawl的数据收集和处理过程包括使用Python开源爬虫工具收集全球范围内的网站数据&#xff0c;并将其上传到‌Com…

人工智能(AI)领域各方向顶会和顶刊

在人工智能&#xff08;AI&#xff09;这个快速发展的领域&#xff0c;研究人员和从业者需要紧跟最新的研究动态和技术进展。顶级的会议和期刊是获取最新科研成果和交流思想的重要平台。以下是人工智能领域内不同方向的顶级会议和期刊概览。 顶级会议 人工智能基础与综合 A…

基于Python的自然语言处理系列(5):窗口分类器用于命名实体识别(NER)

在本系列的第五篇文章中&#xff0c;我们将探讨如何使用窗口分类器进行命名实体识别&#xff08;NER&#xff09;。NER是信息提取中的关键任务&#xff0c;旨在从文本中识别出特定类型的实体&#xff0c;如人名、地名、组织名等。我们将介绍窗口分类器的原理&#xff0c;并展示…

vm虚拟机中ubuntu连不上网络,网络图标消失解决办法

之前做实验调了下机子的网络配置&#xff0c;后面实验做完发现连不上网了&#xff0c;这个问题折磨了我一个多小时&#xff0c;最后终于解决了&#xff0c;记录下解决过程 1. 重启网络服务 有时候简单地重启网络服务就能解决问题&#xff08;我未能解决&#xff0c;可能和碰过…

Spring自定义注解

目录 一、interface 关键字 二、元注解 三、简单实现 四、使用切面执行自定义注解逻辑 1) 首先将刚才的注解修改成放在方法上的&#xff1a; 2) 定义一个切面类&#xff1a; 3&#xff09;将注解放入到接口方法中测试&#xff1a; 五、切点表达式 一、interface 关键字 …

ROADM(可重构光分插复用器)-介绍

1. 引用 https://zhuanlan.zhihu.com/p/163369296 https://zhuanlan.zhihu.com/p/521352954 https://zhuanlan.zhihu.com/p/91103069 https://zhuanlan.zhihu.com/p/50610236 术语&#xff1a; 英文缩写描述灰光模块彩光模块CWDM&#xff1a;Coarse Wave-Length Division …

嵌入式学习--linux系统提供的显示接口”framebuffer“

1.利用framebuffer绘制图像 宏定义 1.#define RGB888_FMT 32 2.#define RGB565_FMT 16 3.#include"utf.h" 函数接口主体 void draw_bmp(int x, int y, char *picname, int w, int h) {int fd open(picname, O_RDONLY);if (-1 fd){perror("fail open bmp&quo…