用fmt.Scanln读整行+strings.Fields拆分可稳健解析输入;ParseFloat需防inf/nan/中文符号/溢出;switch必须含default和除零检查,并用TrimSpace清理运算符空白。

go 语言本身没有内置的交互式计算器库,但用 fmt.Scan、strconv 和基础控制流就能在 50 行内写出一个支持加减乘除的命令行计算器——关键不是“能不能做”,而是怎么避免常见解析陷阱。
用 fmt.Scanf 读取带空格的输入时为什么总出错
直接用 fmt.Scanf("%f %s %f", &a, &op, &b) 看似合理,但用户输 3.5+2.1 或 3.5 + 2.1(多空格)就会失败。更稳妥的方式是先读整行,再切分:
strconv.ParseFloat 解析失败的三个典型原因
不是所有字符串都能转成浮点数,尤其要注意:
- 用户输入
inf、nan或空字符串,ParseFloat会返回 Error - 输入含中文符号如“+”或“×”,
ParseFloat直接报invalid syntax - 数字过大(如 1e400)可能溢出,需检查返回的
err == nil而非只看值
用 switch 处理运算符时别忽略边界情况
Go 的 switch 默认无 fallthrough,但容易漏掉非法操作符的兜底:
立即学习“go语言免费学习笔记(深入)”;
switch op { case "+": result = a + b case "-": result = a - b case "*": result = a * b case "/": if b == 0 { fmt.Println("error: division by zero") continue } result = a / b default: fmt.Println("error: unsupported operator:", op) continue }
- 除零必须显式判断,Go 不会 panic
-
default分支不能省,否则输%或^会静默执行上一个 case - 运算符建议用
strings.TrimSpace(op)清理首尾空白,防止" / "匹配失败
真正难的不是写完四则运算,而是让用户输错一次就明白哪里错了——比如把 3.14.15 当作数字,或者把空行当有效输入。这类细节没加校验,程序看起来能跑,实际一用就崩。