Go 用 flag 包解析命令行参数最直接:flag.Float64/flag.String 自动类型转换与校验,须在 flag.Parse() 前定义所有 flag;不支持位置参数;四则运算用 switch 清晰易扩展,需显式检查除零;输出用 %.2f 统一精度,错误输出到 os.Stderr 且以 error: 开头;编译后单文件静态分发,Windows 需加 .exe 后缀。

用 flag 解析命令行参数最直接
Go 自带的 flag 包足够应付简单计算器的输入需求,比如 calc -op add -a 3.5 -b 2.1。不用引入第三方库,也避免了手动解析 os.Args 容易出错的问题(比如空值、类型转换失败未处理)。
关键点:
-
flag.Float64和flag.String会自动做类型转换和基础校验,失败时默认打印用法并退出 - 必须在
flag.Parse()之前定义所有 flag,否则会被忽略 - 如果想支持位置参数(如
calc add 3 5),就得放弃flag改用os.Args[1:]手动处理——但会失去自动帮助提示和类型安全
四则运算逻辑用 switch 最清晰
把操作符映射到具体函数,switch 比一堆 if/else if 更易读、更易扩展。注意除零要显式检查,浮点数除零在 Go 中不会 panic,但会得到 +Inf 或 -Inf,这不是用户想要的结果。
switch op {
case "add":
result = a + b
case "sub":
result = a - b
case "mul":
result = a * b
case "div":
if b == 0 {
fmt.Fprintln(os.Stderr, "error: division by zero")
os.Exit(1)
}
result = a / b
default:
fmt.Fprintf(os.Stderr, "error: unsupported operator %q\n", op)
os.Exit(1)
}输出格式统一用 fmt.Printf 控制精度
用户输入可能是整数也可能是小数,但输出全保留小数点后两位(或按需截断)更友好。用 %.2f 而不是 %f,避免出现 5.000000 这类冗余显示。
立即学习“go语言免费学习笔记(深入)”;
TURF(开源)权限定制管理系统(以下简称“TURF系统”),是蓝水工作室推出的一套基于软件边界设计理念研发的具有可定制性的权限管理系统。TURF系统充分考虑了易用性,将配置、设定等操作进行了图形化设计,完全在web界面实现,程序员只需在所要控制的程序中简单调用一个函数,即可实现严格的程序权限管控,管控力度除可达到文件级别外,还可达到代码级别,即可精确控制到
另外,错误信息必须输出到 os.Stderr,正常结果输出到 os.Stdout,否则管道使用(如 calc -op add -a 1 -b 2 | grep 3)会混乱。
- 成功时只输出纯数字,不带单位、不带提示文字,方便后续脚本处理
- 所有错误都以
error:开头,便于 grep 过滤 - 不要用
log.Fatal,它会额外打时间戳,破坏 CLI 工具的简洁性
编译后二进制文件可直接分发
Go 的静态链接特性意味着编译出的单文件不含外部依赖。执行 go build -o calc main.go 后,生成的 calc 可直接拷给没装 Go 的机器运行。
几个容易被忽略的细节:









