fmt.scanln卡住因要求换行结束且不跳空格;应改用fmt.scan读单值,bufio.readringer读整行;解析前须检查切片长度、strconv错误及除零;go需编译后执行,非直接运行。

用 fmt.Scanln 读取用户输入时为什么总卡住或读错?
因为 fmt.Scanln 要求输入严格以换行结束,且不跳过前导空格,遇到空行或多余空格就直接返回 0 或报错;实际交互中用户随手敲个空格、回车,它就罢工了。
- 改用
fmt.Scan更鲁棒:它自动跳过空白符,直到读到第一个非空值,适合读单个数字或运算符 - 读整数别直接扫字符串再转,用
fmt.Scan(&num)配合int变量,避免类型转换出错 - 如果要读带空格的整行(比如 “12 + 34”),得用
bufio.NewReader(os.Stdin).ReadString('n'),再手动切分
如何安全解析用户输入的算式,避免 panic: runtime Error: index out of range?
用户随便输个 “5 +” 或 “+ +”,按空格切片后长度可能不足 3,直接取 parts[0]、parts[1]、parts[2] 必崩。
- 先检查切片长度:
if len(parts) != 3就提示格式错误,不往下走 - 用
strconv.Atoi转数字时必须检查 error,不能忽略返回值,否则非法输入(如 “abc”)会导致程序崩溃 - 运算符只认
"+"、"-"、"*"、"/"四种,其他一律拒掉,别用switch漏掉default
除零错误和浮点精度问题在命令行计算器里怎么处理?
Go 的整数除法 / 遇到 0 直接 panic,而用户根本看不到堆栈——只会发现程序突然退出。另外,如果用 Float64 做所有运算,又容易让 “1 + 2” 输出成 “3.000000”。
- 做除法前先判断
if secondNum == 0,提前返回错误提示,别等运行时崩 - 保持整数优先:输入是整数,运算符是四则基础符号,结果也应是整数;只有明确需要小数(比如除不尽)才转 float,且输出用
fmt.printf("%.1f", result)控制位数 - 别用
math.IsNaN或math.IsInf过度防御——命令行简单计算器没那么复杂,守住除零和非法输入就够了
为什么写完代码一运行就 “command not found” 或 “no such file or Directory”?
不是代码问题,是没编译或没加执行权限。Go 不是脚本语言,go run main.go 是临时编译运行,但很多人误以为能像 Python 那样直接 ./main.go。
立即学习“go语言免费学习笔记(深入)”;
- 想当命令行工具用,必须
go build -o calc main.go生成可执行文件,再./calc - 如果提示 permission denied,说明没执行权限:linux/macos 下补一句
chmod +x calc - windows 用户注意路径分隔符不用改,但别双击 exe——要进终端运行,否则窗口一闪就关
真正的麻烦不在语法,而在用户输入永远比你预设的多一个空格、少一个数字、或者干脆输了个 emoji。交互逻辑越简单,越得把边界检查写实。