0502: 表达式求值
解释器
解析了表达式,就可以给 select 和 update 语句添加计算功能:
select a + b, c * d from t where a = 123;
update t set x = x + 1 where a = 123;上一步解析成了树形结构,求值时先计算子树,得到结果后才能计算当前节点。所以这是一个递归遍历树形结构的函数:
func evalExpr(schema *Schema, row Row, expr interface{}) (*Cell, error) {
switch e := expr.(type) {
case string:
// TODO
case *Cell:
return e, nil
case *ExprBinOp:
left, err := evalExpr(schema, row, e.left)
if err != nil {
return nil, err
}
right, err := evalExpr(schema, row, e.right)
if err != nil {
return nil, err
}
// TODO
default:
panic("unreachable")
}
}evalExpr() 函数输入某一列的数据(schema、row),用 switch 语句判断当前表达式的类型,然后返回计算结果(*Cell)。
您正在阅读免费版教程,从第4章起只有简单的指引,适合爱好挑战和自学的读者。
可以购买有详细指导+背景知识的完整版。