15分钟学Go 实战项目一:命令行工具
实战项目一:命令行工具
1. 引言
命令行工具是开发者常用的工具之一,它可以帮助用户通过命令行界面对程序进行控制和交互。在这节中,我们将创建一个简单的命令行工具,以帮助你理解Go语言的基本语法和如何处理命令行输入。在这个过程中,我们将使用Go的内置库,如flag,用以处理命令行参数。
2. 项目概述
我们将构建一个简单的命令行工具,该工具可以执行基本的数学运算,如加法、减法、乘法和除法。用户可以通过命令行输入操作数和运算类型,工具将打印出结果。
2.1 项目结构
我们的项目结构可以如下:
mathcli/
├── main.go
3. 创建项目
3.1 设置工作环境
在命令行中创建一个新的目录来存放我们的项目:
mkdir %GOPATH%\src\mathcli
cd %GOPATH%\src\mathcli
3.2 创建文件
在这个目录下,创建一个名为main.go的文件。
3.3 编写代码
在main.go文件中,输入以下代码:
package mainimport ("flag""fmt""os"
)func main() {// 定义命令行参数op := flag.String("op", "add", "Operation to perform: add, sub, mul, div")a := flag.Float64("a", 0, "First operand")b := flag.Float64("b", 0, "Second operand")// 解析命令行参数flag.Parse()// 执行运算var result float64switch *op {case "add":result = *a + *bcase "sub":result = *a - *bcase "mul":result = *a * *bcase "div":if *b == 0 {fmt.Println("Error: Division by zero")os.Exit(1)}result = *a / *bdefault:fmt.Println("Unsupported operation:", *op)os.Exit(1)}// 打印结果fmt.Printf("Result: %.2f\n", result)
}
4. 代码解析
4.1 包声明
package main:每个Go程序都要声明包,main包是程序的入口。
4.2 导入必要的库
import ("flag""fmt""os"
)
flag:用于解析命令行参数。fmt:用于格式化和输出文本。os:用于处理操作系统功能,如退出程序。
4.3 定义命令行参数
op := flag.String("op", "add", "Operation to perform: add, sub, mul, div")
a := flag.Float64("a", 0, "First operand")
b := flag.Float64("b", 0, "Second operand")
flag.String、flag.Float64用于定义对应的命令行参数及其默认值。
4.4 解析命令行参数
flag.Parse()
用于解析从命令行输入的参数。
4.5 执行运算
switch *op {
case "add":result = *a + *b
case "sub":result = *a - *b
case "mul":result = *a * *b
case "div":if *b == 0 {fmt.Println("Error: Division by zero")os.Exit(1)}result = *a / *b
default:fmt.Println("Unsupported operation:", *op)os.Exit(1)
}
- 使用切换语句来选择不同的运算。
- 加入对除以零的异常处理。
4.6 输出结果
fmt.Printf("Result: %.2f\n", result)
- 格式化输出结果,保留两位小数。
5. 运行程序
5.1 使用命令行运行
- 打开命令提示符,并进入项目目录。
- 运行以下命令进行加法运算:
go run main.go -op=add -a=5 -b=3
- 运行乘法运算:
go run main.go -op=mul -a=4 -b=2
5.2 预期输出
- 加法运算输出:
Result: 8.00
- 乘法运算输出:
Result: 8.00
5.3 参数说明表
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
-op | string | add | 操作类型:add、sub、mul、div |
-a | float64 | 0 | 第一个操作数 |
-b | float64 | 0 | 第二个操作数 |
6. 代码运行流程图
以下是mathcli程序的运行流程图:
+------------------+
| 程序启动 |
+------------------+|v
+------------------+
| 定义命令行参数 |
+------------------+|v
+------------------+
| 解析命令行参数 |
+------------------+|v
+------------------+
| 根据运算类型执行 |
| 相关运算 |
+------------------+|v
+------------------+
| 输出计算结果 |
+------------------+|v
+------------------+
| 程序结束 |
+------------------+
7. 扩展功能
在熟悉了基本的命令行工具后,可以考虑添加更多功能,例如:
7.1 支持更多运算
可以扩展支持指数运算、平方根等功能。
7.2 提供帮助信息
当用户输入-h时,输出命令行参数的说明:
flag.PrintDefaults()
7.3 记录计算历史
通过引入文件操作,记录每次运算的操作数、运算符和结果到一个日志文件中。
func logOperation(op string, a, b, result float64) {f, err := os.OpenFile("operations.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)if err != nil {fmt.Println("Error opening log file:", err)return}defer f.Close()logLine := fmt.Sprintf("%s: %.2f %s %.2f = %.2f\n", time.Now().Format(time.RFC3339), a, op, b, result)f.WriteString(logLine)
}
8. 常见问题与处理
8.1 问题1:无法解析命令行参数
如果程序无法正确解析你输入的命令行参数,检查以下事项:
- 确保在运行时使用了正确的参数名,如
-op、-a和-b。
8.2 问题2:计算结果不正确
如果计算结果不正确,检查输入的操作数和运算符是否正确。
9. 总结
在本节中,我们创建了一个简单的命令行工具,通过实现基本的数学运算,掌握了Go语言的基本语法和命令行参数处理。随着这个示例的完成,你将能够更深入地理解Go语言的特性,以及如何将其应用于实际项目中。后续可以考虑进一步扩展功能,实现更复杂的命令行工具。
怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注下方GZH,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关文章:
15分钟学Go 实战项目一:命令行工具
实战项目一:命令行工具 1. 引言 命令行工具是开发者常用的工具之一,它可以帮助用户通过命令行界面对程序进行控制和交互。在这节中,我们将创建一个简单的命令行工具,以帮助你理解Go语言的基本语法和如何处理命令行输入。在这个过…...
lesson02 作业
lesson02-01作业 小红的体重是 m 千克,她想知道自己的体重在磅(1 千克约等于 2.20462 磅)是多少 输入描述 输入一个整数表示小红的标准体重m(kg) 输出描述 输出一个整数表示转换后的磅值n 磅 示例 输入: 50 输出:…...
港大和字节提出长视频生成模型Loong,可生成具有一致外观、大运动动态和自然场景过渡的分钟级长视频。
HKU, ByteDance|⭐️ 港大和字节联合提出长视频生成模型Loong,该模型可以生成外观一致、运动动态大、场景过渡自然的分钟级长视频。选择以统一的顺序对文本标记和视频标记进行建模,并使用渐进式短到长训练方案和损失重新加权来克服长视频训练…...
RabbitMQ进阶_可靠性
文章目录 一、 发送者的可靠性1.1、 生产者重试机制1.2、 生产者确认机制1.2.1、确认机制理论1.2.2、确认机制实现1.2.2.1、定义ReturnCallback1.2.2.2、定义ConfirmCallback 二、 MQ的可靠性2.1、 数据持久化2.1.1、 交换机持久化2.1.2、 队列持久化2.1.3、 消息持久化 2.2、 …...
JavaScript字符串的常用方法有哪些?
1.1操作方法 归纳为增删查改 1.1.1增 这里不是直接增添内容,而是创建字符串的一个副本,再进行操作 处理用以及${}进行字符串拼接外,还可以通过concat 1.1.1.1concat 用于将一个或多个字符串拼接为一个新字符串(浅拷贝&#…...
jmeter发送post请求
在jmeter中,有两种常用的请求方式,get和post.它们两者的区别在于get请求的参数一般是放在路径中,可以使用用户自定义变量和函数助手等方式进行参数化,而post请求的参数不能随url发送,而是作为请求体提交给服务器。而在…...
图文深入理解Oracle Total Recall
List item 题记:本文图文深入理解Oracle Total Recall技术。 1. Oracle Total Recall 概述 Oracle Total Recall(也称为 Flashback Data Archive - 闪回数据归档)提供了一种用于跟踪数据库更改的机制,可自动跟踪数据库历史更改…...
腾讯云控制台URL刷新URL预热 使用接口刷新
如图所示的俩个控制台功能,调用腾讯云的接口执行这俩个动作 (代码可以优化)nodejs框架是express, 这里粘贴调用成功的代码示例,做个记录。 app.get(/PurgeUrlsCache, async function (req, res, next) {// Depends on tencentclo…...
构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像
在尝试获取etcd的容器的最新版本镜像时,使用latest作为tag取到的并非最新版本,本文尝试用实际最新版本的版本号进行pull,从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …...
libaom-all-intra参数说明
part_sf.less_rectangular_check_level 1; 这个设置可能控制编码器在分割画面时使用非矩形分区的检查级别。part_sf.ml_prune_partition 1; 这个设置可能用于基于机器学习(ML)的分区修剪,以减少不必要的计算。part_sf.prune_ext_partition_…...
应用假死?
有个客户10月18日应用接口都访问慢,nginx层面error显示连接拒绝,当时实施同学重启了java应用运行正常,但今天又卡死了,后台登录也登录不上去,看日志没异常,最终找到了数据库层面。 查看数据库相关日志&…...
SAP MM+FI - 物料管理模块与财务会计模块的集成配置
01 采购费用过账配置表 为了方便项目实施过程中采购费用过账配置,迪森资深专家根据丰富经验总结得出采购费用过账配置表,以供大家参考: 02 材料采购订单入库及结算 2.1采购订单入库 假设:入库数量1000PC,价格 10 元…...
初阶数据结构【3】--单链表(比顺序表还好的一种数据结构!!!)
本章概述 前情回顾单链表实现单链表彩蛋时刻!!! 前情回顾 咱们在上一章博客点击:《顺序表》的末尾,提出了一个问题,讲出了顺序表的缺点——有点浪费空间。所以,为了解决这个问题,我…...
mysql迁移到达梦的修改点
字段是达梦关键字的,达梦会给转成大写,如果不要转则需要使用双引号引起来。关键字参考:D:\dmdbms\doc\DM8_SQL语言使用手册.pdf 例如:RowCount Level Content Password Locked 中文乱码问题,需要在应用程序所在服务器的…...
Go小技巧易错点100例(十八)
正文: 使用下划线增加数字可读性 有时候我们代码里会定义很长的数字,虽然计算机程序能支持很大的数据的计算,但是对我们来说,可读性是一个需要考虑的点,特别是1后面全是0的时候。 但是这个问题在Go语言中是可以通过…...
【python】极简教程8-字符串
第八章:字符串 8.1 字符串即序列 字符串是一系列字符的有序集合,可以使用索引访问字符串中的各个字符,索引从 0 开始。 示例代码: fruit = banana letter = fruit[1] print(letter) # 输出: a8.2 len 函数 len 函数返回字符串的长度(字符数)。...
UEFI EDK2框架学习 (四)——UEFI图形化
一、修改protocol.c #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> #include <stdio.h>EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable ) {EFI_STATUS S…...
【C++】— 一篇文章让你认识STL
文章目录 🌵1.什么是STL?🌵2.STL的版本🌵3.STL的六大组件🌵4.STL的重要性🌵5. 如何学习STL🌵6. 学习STL的三种境界 🌵1.什么是STL? STL是Standard Template Library的简称…...
mysql--索引
目录 1、长什么样 2、硬件理解 3、软件理解 4、进一步认识 5、索引的理解 6、为什么不选择其他数据结果? 7、聚簇索引和非聚簇索引 8、索引操作 (1)主键索引创建 第一种方式 第二种方式 第三种方式 主键索引的特点 (…...
【linux】线程 (三)
13. 常见锁概念 (一)了解死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程占有的,且不释放的资源,而处于的一种永久等待状态 (二)死锁四个必要条件 互斥条件…...
DeepSeek系统设计辅助效能断崖式下降的3个信号,第2个90%工程师至今未察觉!
更多请点击: https://kaifayun.com 第一章:DeepSeek系统设计辅助效能断崖式下降的3个信号,第2个90%工程师至今未察觉! 当 DeepSeek 的系统设计辅助能力突然变“笨”——接口建议频繁失准、上下文感知错乱、生成代码无法通过基础编…...
【紧急预警】92%的DeepSeek测试用例生成失败源于这4个隐性配置缺陷——资深SDET连夜整理修复清单
更多请点击: https://codechina.net 第一章:DeepSeek测试用例生成的现状与危机本质 当前,DeepSeek系列大模型(如DeepSeek-Coder、DeepSeek-VL)在代码生成与理解任务中展现出强大能力,但其测试用例自动生成…...
智慧树自动刷课助手:3步告别手动操作的学习效率工具
智慧树自动刷课助手:3步告别手动操作的学习效率工具 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的重复刷课操作而烦恼吗?智…...
孤舟笔记 互联网常用框架篇三 Dubbo是如何动态感知服务下线的?注册中心和服务端双保险
文章目录先说结论机制一:注册中心通知机制二:心跳检测机制三:连接事件感知机制四:定时拉取四种机制的协作回答技巧与点评加分回答面试官点评个人网站微服务环境下,服务实例随时可能上下线——重启、扩容、宕机……调用…...
GEO生成引擎优化:当AI成为信息分发的主角,品牌如何抢占对话窗口?
当用户不再"搜索-浏览",而是直接"AI提问-获取答案",传统SEO的逻辑正在被彻底改写。2026年,GEO(Generative Engine Optimization,生成式引擎优化)已经从概念走向规模化落地。本文从技术…...
PCL 法向量夹角剔除错误匹配点对【2026最新版】
目录 一、 算法简介 1、主要函数 2、参考文献 二、 代码实现 三、 结果展示 四、 参考链接 博客长期更新,本文最新更新时间为:2026年5月24日。代码在PCL1.15.1中测试通过 一、 算法简介 在三维点云配准中,对应点(correspondence)的准确性直接决定了配准算法的精度和鲁棒性…...
为你的Hermes Agent自定义Provider,接入Taotoken多模型池
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为你的Hermes Agent自定义Provider,接入Taotoken多模型池 在构建复杂的AI应用时,开发者常常面临一个核心挑…...
氘可来昔替尼常见副作用为鼻咽炎头痛及腹泻,如何应对?
任何口服药物的临床价值,都必须在疗效与安全性的天平上找到精准的平衡点。氘可来昔替尼以PASI 75应答率的全面胜出证明了自己在银屑病治疗中的卓越地位,而其不良反应谱同样经过了严苛的临床验证。鼻咽炎、头痛和腹泻构成了这款药物最需关注的三大安全信号…...
LPCM框架:大模型驱动的计算机架构设计革命
1. LPCM框架:计算机系统架构设计的范式革命计算机系统架构设计正站在历史性的转折点上。过去八十年来,从ENIAC的真空管到现代7纳米制程的异构计算芯片,架构设计始终遵循着"专家经验EDA工具"的传统范式。但随着摩尔定律逼近物理极限…...
从NLP到RAG:AI标书生成系统的技术架构与落地路径深度剖析
引言2026年2月,国家发改委等八部门联合印发《关于加快招标投标领域人工智能推广应用的实施意见》,明确到2026年底招标文件检测、智能辅助评标、围串标识别等重点场景在部分省市实现全覆盖。同一时期,《招标投标法》修订草案经国务院常务会议原…...
