你好,我是小X。
曹大最近开 Go 课程了,小X 正在和曹大学 Go。
这个系列会讲一些从课程中学到的让人醍醐灌顶的东西,拨云见日,带你重新认识 Go。
抽象语法树是编译过程中的一个中间产物,一般简单了解一下就行了。但我们可以把 Go 语言的整个 parser 和 ast 包直接拿来用,在一些场景下有很大的威力。
什么是 ast 呢,我从维基百科上摘录了一段:
在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
核心就是说 ast 能以一种树的形式表示代码结构。有了树结构,就可以对它做遍历,能干很多事。
假定一个场景
假定一个场景:我们可以从司机平台的某个接口获取司机的各种特征,例如:年龄、订单数、收入、每天驾驶时长、驾龄、平均车速、被投诉次数……数据一般采用 json 来传递。
司机平台的运营小姐姐经常需要搞一些活动,例如选出:
订单数超过 10000,且驾龄超过 5 年的老司机
每天驾驶时小于 3 小时,且收入超过 500 的高效司机
年龄大于 40,且平均速度大于 70 的“狂野”司机
……
这些规则并不是固定的,经常在变化,但总归是各种司机特征的组合。
为了简化,我们选取 2 个特征,并用一个 Driver
结构体来表示:
type Driver struct {
Orders int
DrivingYears int
}
为了配合运营搞活动,我们需要根据运营给的规则来判断一个司机是否符合要求。
如果公司人多,可以安排一个 rd 专门伺候运营小姐姐,每次做活动都来手动修改代