Golang简易计算器API通过/net/http实现安全四则运算:GET /calc?expr=...解析表达式,手写词法分析避免eval风险,支持+ - * /左结合无优先级,返回{"result":n}或{"error":"msg"}。

用 Golang 实现一个简易计算器 API,核心是启动一个 HTTP 服务,接收带运算表达式的请求(如 ?expr=2+3*4),解析并计算结果后以 JSON 返回。不需要 Web 框架,标准库 net/http 就够用,重点在安全解析和错误处理。
设计简洁的 HTTP 接口
定义一个 GET 路由,比如 /calc,通过 URL 查询参数 expr 传入表达式。例如:
-
GET /calc?expr=10-2*3→ 返回{"result":4} -
GET /calc?expr=7/0→ 返回{"error":"division by zero"} - 不支持括号、变量或函数,只处理
+ - * /四则运算,左结合,无优先级(简化版);若需优先级,可引入简单递归下降解析器或使用第三方库如go-simplemath。
安全解析与计算表达式
避免直接用 eval 或 go/parser 执行任意代码——有严重安全风险。推荐手写一个轻量级词法分析 + 计算逻辑:
- 用
strings.FieldsFunc(expr, func(r rune) bool { return r == '+' || r == '-' || r == '*' || r == '/' })拆分数字,再按操作符顺序遍历 - 更稳妥做法:遍历字符串,跳过空格,逐字符识别数字(支持负数和小数)、操作符;用栈或双变量维护当前值和待运算符
- 务必检查每个数字是否为有效浮点数(
strconv.ParseFloat),捕获strconv.ErrSyntax - 遇到除零、溢出、空表达式等,统一返回结构化错误
实现 HTTP 处理器与启动服务
定义 handler 函数,解析 query、调用计算函数、写入 JSON 响应:
立即学习“go语言免费学习笔记(深入)”;
- 设置响应头
w.Header().Set("Content-Type", "application/json") - 用
r.URL.Query().Get("expr")获取表达式,判空处理 - 计算后用
json.NewEncoder(w).Encode(map[string]interface{}{...})输出 - 主函数中调用
http.ListenAndServe(":8080", nil)启动服务,监听本地 8080 端口 - 加一句
log.Println("Server running on :8080")方便确认启动成功
测试与运行
保存为 main.go,终端执行:










