PHP转GO Day2 数据类型与控制结构实践(开发计算器)
Day2 数据类型与控制结构实践(开发计算器)
计算器开发问题排查指南
一、基础版计算器代码(含常见Bug)
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
if len(os.Args) != 4 {
fmt.Println("用法:calc 数字1 运算符(+ - * /) 数字2")
return
}
a, _ := strconv.Atoi(os.Args[1])
op := os.Args[2]
b, _ := strconv.Atoi(os.Args[3])
switch op {
case "+":
fmt.Printf("结果:%d\n", a+b)
case "-":
fmt.Printf("结果:%d\n", a-b)
case "*":
fmt.Printf("结果:%d\n", a*b)
case "/":
fmt.Printf("结果:%d\n", a/b)
default:
fmt.Println("不支持的运算符")
}
}
二、典型问题与解决方案
问题1:参数数量错误
🛑 现象
输入calc 10 +
后程序崩溃
🔍 原因分析
未正确处理参数数量不足的情况
✅ 解决方案
修改第8行代码:
// 修改前
if len(os.Args) != 4 {
// 修改后(os.Args[0]是程序自身路径)
if len(os.Args) < 4 {
fmt.Println("用法:calc 数字1 运算符(+ - * /) 数字2")
os.Exit(1) // 明确退出状态码
}
问题2:非数字输入
🛑 现象
输入calc abc + 3
显示错误结果
🔍 原因分析
未处理strconv.Atoi
的错误返回值
✅ 解决方案
修改数值转换部分:
// 修改前
a, _ := strconv.Atoi(os.Args[1])
// 修改后
a, err := strconv.Atoi(os.Args[1])
if err != nil {
fmt.Printf("错误:%s 不是有效数字\n", os.Args[1])
os.Exit(2)
}
// 同样处理b的转换
问题3:除以零错误
🛑 现象
输入calc 10 / 0
导致程序崩溃
🔍 原因分析
未检查除数是否为零
✅ 解决方案
在除法分支添加判断:
case "/":
if b == 0 {
fmt.Println("错误:除数不能为零")
os.Exit(3)
}
fmt.Printf("结果:%d\n", a/b)
问题4:浮点数计算
🛑 现象
calc 5 / 2
输出2,而不是2.5
🔍 原因分析
整数除法会自动取整
✅ 解决方案
改用浮点类型:
// 修改转换代码
a, err := strconv.ParseFloat(os.Args[1], 64)
b, err := strconv.ParseFloat(os.Args[3], 64)
// 修改输出格式
fmt.Printf("结果:%.2f\n", a/b) // 保留两位小数
问题5:无效运算符
🛑 现象
输入calc 10 % 3
未提示错误
🔍 原因分析
default
分支未处理
✅ 解决方案
增强提示:
default:
fmt.Printf("错误:'%s' 不是有效运算符\n", op)
os.Exit(4)
三、完整修复版代码
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
if len(os.Args) < 4 {
fmt.Println("用法:calc 数字1 运算符(+ - * /) 数字2")
os.Exit(1)
}
a, err := strconv.ParseFloat(os.Args[1], 64)
if err != nil {
fmt.Printf("错误:%s 不是有效数字\n", os.Args[1])
os.Exit(2)
}
op := os.Args[2]
b, err := strconv.ParseFloat(os.Args[3], 64)
if err != nil {
fmt.Printf("错误:%s 不是有效数字\n", os.Args[3])
os.Exit(2)
}
switch op {
case "+":
fmt.Printf("结果:%.2f\n", a+b)
case "-":
fmt.Printf("结果:%.2f\n", a-b)
case "*":
fmt.Printf("结果:%.2f\n", a*b)
case "/":
if b == 0 {
fmt.Println("错误:除数不能为零")
os.Exit(3)
}
fmt.Printf("结果:%.2f\n", a/b)
default:
fmt.Printf("错误:'%s' 不是有效运算符\n", op)
os.Exit(4)
}
}
四、测试用例验证
测试命令 | 预期结果 | 验证目的 |
---|---|---|
calc 8 + 3 | 结果:11.00 | 加法正确性 |
calc 5 - 9 | 结果:-4.00 | 负数处理 |
calc 6 / 0 | 错误提示 | 除零保护 |
calc 7.5 * 2 | 结果:15.00 | 浮点运算 |
calc abc + 3 | 错误提示 | 输入校验 |
五、PHP开发者特别注意
-
类型转换差异
- PHP自动类型转换 → Go必须显式转换
- 示例:
"5" + 3
在PHP=8,在Go会报错
-
错误处理机制
- PHP使用
try/catch
→ Go通过返回error
值
- PHP使用
-
运算精度
- PHP默认浮点运算 → Go需要手动指定
float64
- PHP默认浮点运算 → Go需要手动指定
通过本指南,可系统性解决计算器开发中的常见问题,建议使用VS Code的调试功能逐步执行代码观察变量变化。