Go 1.16+ 默认启用 module 模式,需先执行 go mod init 初始化模块;计算器用 os.Args 解析命令行参数,strconv.ParseFloat 处理浮点数,显式判断除零,支持 + - * / 四则运算。

确认 go 命令可用且 $GOPATH 设置正确
很多初学者卡在这一步:明明装了 Go,运行 go version 没问题,但 go run main.go 报错说找不到包或模块。核心原因是 Go 1.16+ 默认启用 module 模式,而新手常忽略初始化动作。
- 执行
go version确认输出类似go version go1.22.0 darwin/arm64 - 检查
go env GOPATH—— 如果你没手动改过,它通常指向$HOME/go,但现代项目**不需要依赖GOPATH目录结构**,只要确保当前目录能初始化 module 即可 - 在空目录下立即执行
go mod init calc(模块名随便起,但别用main或保留字)
写一个带命令行参数的加减乘除计算器
不搞 Web、不接 API,就用 os.Args 解析命令行输入,最贴近“第一个实战”的原始感。重点是让逻辑跑通,而不是追求 UI 美观。
- 新建
main.go,内容如下:
package main
<p>import (
"fmt"
"os"
"strconv"
)</p><p>func main() {
if len(os.Args) != 4 {
fmt.Println("用法: calc ")
os.Exit(1)
}</p><pre class="brush:php;toolbar:false;">a, err := strconv.ParseFloat(os.Args[1], 64)
if err != nil {
fmt.Printf("错误: 第一个参数 '%s' 不是有效数字\n", os.Args[1])
os.Exit(1)
}
op := os.Args[2]
b, err := strconv.ParseFloat(os.Args[3], 64)
if err != nil {
fmt.Printf("错误: 第三个参数 '%s' 不是有效数字\n", os.Args[3])
os.Exit(1)
}
var result float64
switch op {
case "+":
result = a + b
case "-":
result = a - b
case "*":
result = a * b
case "/":
if b == 0 {
fmt.Println("错误: 除数不能为零")
os.Exit(1)
}
result = a / b
default:
fmt.Printf("错误: 不支持的操作符 '%s'\n", op)
os.Exit(1)
}
fmt.Printf("%.2f %s %.2f = %.2f\n", a, op, b, result)}
- 注意:
os.Args[0]是程序名,所以真正参数从os.Args[1]开始取 - 用
strconv.ParseFloat(..., 64)而不是ParseInt,避免整数溢出误判,也兼容小数输入(如calc 3.14 + 2.86) - 除零判断必须显式写,Go 不会 panic,但结果是
+Inf或-Inf,不符合计算器预期
运行时常见报错及修复
实际敲命令时最容易遇到三类问题,不是代码写错,而是环境或调用姿势不对。
-
go: no required module provides package ...:没运行过go mod init,补上即可 -
command-line-arguments: no such file or directory:当前目录下没有main.go,或文件名拼错(比如写成Main.go) -
invalid operation: a + b (mismatched types int and float64):说明你漏了类型转换,os.Args全是字符串,必须用strconv解析,不能直接做算术 - 执行命令示例:
go run main.go 5 + 3(注意空格分隔,操作符单独一个参数)
后续可扩展的真实需求点
这个计算器跑起来只是起点。如果想继续往下走,别急着加 GUI 或 Web 页面,先处理几个真实开发中马上会撞上的问题:
- 支持更多运算符(比如
%、^),注意^在 Go 里是位异或,幂运算得用math.Pow - 把计算逻辑抽成函数,比如
func calc(a, b float64, op string) (float64, error),方便单元测试 - 加一个
go test文件,验证calc(10, 3, "/")是否返回3.33(注意浮点精度) - 如果想支持表达式如
"1 + 2 * 3",那就得引入简单 parser,此时该考虑用goyacc或手写递归下降——但那是下一个阶段的事了
真正容易被忽略的是:第一次 go mod init 后生成的 go.mod 文件,它锁定了 Go 版本和依赖(虽然现在没依赖),后续所有 go 命令都以此为准。删掉它再试,会发现连 go run 都失败——module 不是可选配件,是现代 Go 的默认执行上下文。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











