golang 规则引擎      2023-02-12

写在前面

目前反作弊项目的核心项目是规则引擎,实现规则引擎在类似 python/php/javascrip 之类的解释型语言中可以直接通过 eval 之类的函数来模拟实现,但是在编译型语言比如 Go 实现就没那么容易了。

原因在于解释型语言本身就是动态解释执行的,可以在运行时把输入的文本作为语言本身去解释执行,但是编译型语言是去运行编译之后的机器码,此时能动态执行的内容非常有限且必须依靠语言特性。比如在 Go 语言内只能通过反射实现一些有限的动态执行,反射是完全依靠 interface 的内部实现。

解释器过程

规则引擎其实可以看作一个简化的单行脚本语言,所以要通过 Go 实现一个规则引擎其实就是使用 Go 实现一个简化版的脚本语言解释器。

我们来看看实现一个解释器的基本流程:

解释器流程

词法分析(Lexical analysis)

词法分析**(**lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。

完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器,核心任务是扫描、识别单词且对识别出的 Token 给出定性、定长的处理。

词法分析器一般从左至右地对源程序进行扫描,按照语言的词法规则识别各类 Token 。

Token

Token 是用于描述与归类从文本中分解出来的最小描述单元的一种结构。

词法分析器通常只识别Token ,但是不会关心 Token 之间的关系。例如:词法分析器能够将括号识别为单词,但并不保证括号是否匹配。

Token 序列本身并没有实际意义,必须通过语法分析将 Token 作为输入进行语法分析来保证 Token 的可用性和有意义的。

语法分析(Syntax analysis)

在计算机科学中,语法分析(syntactic analysis)是根据某种给定的形式文法对由 Token 序列构成的输入文本进行分析并确定其语法结构的一种过程。

语法分析器(parser)通常是作为编辑器或者解释器的组件出现的,它的作用是进行语法检查、并构建由输入的 Token 组成的数据结构,比如抽象语法树(AST)等层次化的数据结构。

实现 INI 解析

golang context 协程      2020-12-18
### 由"并发控制"开始 golang语言层面提供了协程支持为我们开发高并发程序带来巨大便利,但是就因为太容易开辟协程引入了一个大部分时候我们都容易忽视的问题:协程泄露。 阅读下以下代码: ```go func main() { r := gin.Default() r.GET("/run", func(c *gin.Context) { for { fmt.Println
gdb mac golang      2020-08-21
## mac 下 gdb 安装及错误排查 ### 使用 brew 安装 gdb ```brew install gdb``` ### gdb签名 安装后直接使用会提示『Unable to find Mach task port for process-id』错误。这是因为 macos 下gdb 没有权限去访问其他进程,此时需要使用自签名系统证书并给 gdb 程序签名。 1. 在钥
golang redis 分布式 定时任务      2018-11-08
### 背景 最近项目中的定时任务越来越多,为了防止任务重复执行曾经使用过的方案: - 只启用了一个节点。 - 固定循环间隔,使用分布式事务锁。 第一种方案没有容错机制,当单个节点宕机,所有定时任务都无法正常执行。 第二种方案不能跟cron一样灵活设定时间,比如需要设定每天1点执行就必须借助数据库或者其他存储手段去轮询,非常低效。 在对比了市面上主流的分布式定时任务库后,发现要不就是过