Golang笔记:使用os.Args和flag包编写命令行界面(CLIs)

news/2024/12/29 20:43:33/

文章目录

  • 目的
  • os.Args
  • flag
  • FlagSet
  • 总结

目的

命令行界面(Command-line Interfaces)是比较常用的一种软件形式。对于大部分开发运维人员来说很多时候CLIs可能比图形界面更加方便。软件开发时也经常会有需要开发命令行界面形式软件的情况,使用Golang来开发是一种比较不错的选择。这篇文章将简单介绍使用Golang标准库中os.Args和flag包编写命令行界面。

os.Args

标准库 os 包中的 var Args []string 保存了命令行参数,第一个参数( os.Args[0] )是程序名。

Args hold the command-line arguments, starting with the program name.

在这里插入图片描述

能拿到命令行参数就算是编写命令行界面的第一步了。下面的 flag 包可以用来解析这些参数,其内部通过 os.Args[1:] 方式获取参数。

flag

实际使用时命令行参数通常是有多种形态的(比如 app -arg1 --arg2 -arg3=val -arg4 val ),并且顺序也是可以自由调整的,标准库中的 flag https://pkg.go.dev/flag 包可以用于解析处理命令行参数,方便进一步的使用。

flag 包可以用来处理 -flag value 或者 --flag value 形式的参数选项。(好像必须是这种形式的,单纯的 -flag 或者 --flag 这种形式的不支持

可以使用 func Type(name string, value Type, usage string) *Type 方法添加要选项, name 是选项名称, value 是默认值, usage 是选项的文本说明, Type 常见的Golang的基础的数据类型都支持。该方法返回一个选项类型数据的指针。

添加了选项后可以使用 func Parse() 进行命令行参数解析。下面是最基础的使用演示:
在这里插入图片描述

使用时选项可以是 -flag --flag -flag=value --flag=value -flag value --flag value ,布尔类型的选项必须使用 = 赋值。

选项数值类型值可以是 1234 0664 0x1234 -1 -255 等形式的;布尔类型 1 t T true TRUE True 等都会识别为真, 0 f F false FALSE False 都会识别为假。

通常使用时同一个选项可以有长短两种表达,使用 flag 包可以使用 func TypeVar(p *Type, name string, value Type, usage string) 方法来处理。该方法和前面的很像,只不过之前通过方法创建返回的变量现在需要自己创建后传入。下面是使用演示:
在这里插入图片描述

flag 包会自动添加帮助选项 -h --h -help --help
在这里插入图片描述

这个帮助选项输出的信息也可以自定义:
在这里插入图片描述

对于命令行参数中剩余的部分可以使用下面一些方法来获取个数和内容等:
func NArg() int func Arg(i int) string func Args() []string

到目前为止虽然只是在将命令行参数获取和解析等内容,但这就是编写命令行界面程序最核心的部分了,剩下的无法是根据解析得到的内容进行相应的处理。

FlagSet

flag 包还可以使用其中的 FlagSet 来进行更加精细化的操作,比如设置子命令等。下面是个简单的演示:

package mainimport ("flag""fmt""os"
)func fncmda() {cmda := flag.NewFlagSet("cmda", flag.ContinueOnError) // 创建子命令解析器sFlag := cmda.String("s", "naisu", "help msg for cmda -s") // 设置子命令选项err := cmda.Parse(os.Args[2:]) // 从下标2的参数开始解析if err != nil {fmt.Println(err)}fmt.Println(*sFlag)
}func fncmdb() {cmdb := flag.NewFlagSet("cmdb", flag.ContinueOnError) // 创建子命令解析器iFlag := cmdb.Int("i", 233, "help msg for cmdb -i") // 设置子命令选项err := cmdb.Parse(os.Args[2:]) // 从下标2的参数开始解析if err != nil {fmt.Println(err)}fmt.Println(*iFlag)
}func main() {if len(os.Args) < 2 {os.Args = append(os.Args, "default")}switch os.Args[1] { // 根据不同子命令进行不同处理case "cmda":fncmda()case "cmdb":fncmdb()default:fmt.Println("子命令不存在")}
}

在这里插入图片描述

使用这些方式可以实现更加个性化或更加复杂的设置,但是通常不推荐怎么做,如果有更多的需求,更加推荐使用线程的框架来处理。

总结

对于简单的项目使用上面方式开发使用还是挺方便的。对于复杂的项目或是功能更加完善的项目来说使用现有的框架来开发会更加方便。Golang中用来开发命令行界面的框架比较热门的有下面两个:

  • Cobra
    https://cobra.dev/
    https://github.com/spf13/cobra
  • urfave/cli
    https://cli.urfave.org/
    https://github.com/urfave/cli

http://www.ppmy.cn/news/69491.html

相关文章

Highcharts Core Crack

Highcharts Core Crack 添加了新的“x轴交叉”和“y轴交叉”选项&#xff0c;使创建数学绘图的轴布局变得更容易。 添加了新的“series.legendSymbol”选项。 Highcharts是业界领先的JavaScript图表库。Highcharts被数以万计的开发人员和全球100家最大公司中超过80%的公司使用。…

Leetcode 第 345 场周赛 Problem D 统计完全连通分量的数量

Leetcode 第 345 场周赛 Problem D 统计完全连通分量的数量题目 给你一个整数 n 。现有一个包含 n 个顶点的 无向 图&#xff0c;顶点按从 0 到 n - 1 编号。给你一个二维整数数组 edges 其中 edges[i] [ai, bi] 表示顶点 ai 和 bi 之间存在一条 无向 边。返回图中 完全连通分…

大咖齐聚CCIG论坛——文档图像智能分析的产业前沿

目录 1 文档图像智能分析技术2 大咖齐聚CCIG20233 议题介绍3.1 从模式识别到类脑研究3.2 视觉-语言预训练模型演进及应用3.3 篡改文本图像的生成和检测3.4 智能文档处理在工业界的应用与挑战 4 观看入口&议程 1 文档图像智能分析技术 文档图像智能分析是指使用计算机视觉和…

Maven基础篇

Maven基本概念 Maven是什么 maven的本质是一个项目管理工程&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09; POM&#xff08;Project Object Model&#xff09;&#xff1a;项目对象模型 作用 项目构建&#xff1a;提供标准的、跨平台…

Spring IOC 原理以及实现源码分析

前言 在 Spring 程序设计中&#xff0c;IOC (Inversion of Control) 即控制反转是一个重要的概念&#xff0c;它是 Spring 框架的核心机制之一&#xff0c;在程序中广泛使用。本文将会对 Spring IOC 的概念、实现原理和源码进行详细的解析。 控制反转&#xff08;IoC&#xff…

在外远程NAS群晖Drive - 群晖Drive挂载电脑磁盘同步备份【无需公网IP】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 转发自CSDN远程穿透的文章&#xff1a;【…

AI题目整理

文章目录 1、网络配置时batchsize的大小怎样设置?过小和过大分别有什么特点?2、设置学习率衰减的原因?3、有哪些分类算法?4、分类和回归的区别?5、请描述一下K-means聚类的过程?6、训练集、测试集、验证集的作用?7、请讲解一下k折交叉验证?8、分类和聚类的区别?9、讲述…

图像分割(Segmentation)

文章目录 图像分割FCNU-NetSegNetDeepLab图像分割常用数据集 图像分割 图像分割是预测图像中每一个像素所属的类别或者物体。基于深度学习的图像分割算法主要分为两类&#xff1a; 语义分割&#xff08;Semantic Segmentation&#xff09; 为图像中的每个像素分配一个类别。 …