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

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.Stringflag.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 使用命令行运行

  1. 打开命令提示符,并进入项目目录。
  2. 运行以下命令进行加法运算:
go run main.go -op=add -a=5 -b=3
  1. 运行乘法运算:
go run main.go -op=mul -a=4 -b=2

5.2 预期输出

  • 加法运算输出:
Result: 8.00
  • 乘法运算输出:
Result: 8.00

5.3 参数说明表

参数类型默认值说明
-opstringadd操作类型:addsubmuldiv
-afloat640第一个操作数
-bfloat640第二个操作数

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 输出&#xff1a…...

港大和字节提出长视频生成模型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

文章目录 &#x1f335;1.什么是STL&#xff1f;&#x1f335;2.STL的版本&#x1f335;3.STL的六大组件&#x1f335;4.STL的重要性&#x1f335;5. 如何学习STL&#x1f335;6. 学习STL的三种境界 &#x1f335;1.什么是STL&#xff1f; STL是Standard Template Library的简称…...

mysql--索引

目录 1、长什么样 2、硬件理解 3、软件理解 4、进一步认识 5、索引的理解 6、为什么不选择其他数据结果&#xff1f; 7、聚簇索引和非聚簇索引 8、索引操作 &#xff08;1&#xff09;主键索引创建 第一种方式 第二种方式 第三种方式 主键索引的特点 &#xff08…...

【linux】线程 (三)

13. 常见锁概念 &#xff08;一&#xff09;了解死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程占有的&#xff0c;且不释放的资源&#xff0c;而处于的一种永久等待状态 &#xff08;二&#xff09;死锁四个必要条件 互斥条件…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...