用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(多空格)就会失败。更稳妥的方式是先读整行,再切分:
- 用
fmt.Scanln(&input)获取完整字符串 - 用
strings.Fields(input)拆出非空字段,自动处理任意空格 - 检查切片长度是否为 3,否则提示格式错误
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 当作数字,或者把空行当有效输入。这类细节没加校验,程序看起来能跑,实际一用就崩。










