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. 常见锁概念 (一)了解死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程占有的,且不释放的资源,而处于的一种永久等待状态 (二)死锁四个必要条件 互斥条件…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
