当前位置: 首页 > news >正文

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开发者特别注意

  1. 类型转换差异

    • PHP自动类型转换 → Go必须显式转换
    • 示例:"5" + 3在PHP=8,在Go会报错
  2. 错误处理机制

    • PHP使用try/catch → Go通过返回error
  3. 运算精度

    • PHP默认浮点运算 → Go需要手动指定float64

通过本指南,可系统性解决计算器开发中的常见问题,建议使用VS Code的调试功能逐步执行代码观察变量变化。

相关文章:

  • BRAM消耗与FIFO的关系:有效利用FPGA资源的策略
  • 面试整理--一个报告生成的方案解析
  • excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果追加到json文件
  • C语言:字符串去特定字符
  • UGO和ACL
  • 从关键词到权重:TF-IDF算法解析
  • Atom of Thoughts for Markov LLM Test-Time Scaling论文解读
  • 凸集和凸函数
  • Google C++编码规范指南(含pdf)
  • python主成分分析法1
  • MyBatis 配置文件解析使用了哪些设计模式
  • 在 Dojo 框架中define、declare 和 require的区别
  • 【自用】NLP算法面经(5)
  • 美摄接入DeepSeek等大模型,用多模态融合重构视频创作新边界!
  • 从零开发数据可视化
  • node-ddk,electron 组件, 系统基上下文菜单(右键菜单)
  • qt 图像后处理的软件一
  • spring boot3 验证码工具kaptcha使用
  • vue 自制列表,循环滚动
  • python本地连接minio
  • 昔日千亿房企祥生集团约2.03亿元债权被拍卖,起拍价8000万元
  • 上海虹桥国际咖啡文化节开幕,推出茶咖文化特色街区、宝妈咖啡师培训
  • 马上评|这种“维权”已经不算薅羊毛,涉嫌犯罪了
  • 美叙领导人25年来首次会面探索关系正常化,特朗普下令解除对叙经济制裁
  • 俄副外长:俄美两国将举行双边谈判
  • 上海首发经济“卷”到会展业,浦东签约三个年度“首展”