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

news2024/11/17 15:55:27

文章目录

  • 目的
  • 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 main

import (
	"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.coloradmin.cn/o/517770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈和队列:理解与使用

目录 栈 顺序栈结构 链式栈结构 中缀表达式和后缀表达式 顺序栈四则运算 链式栈四则运算 队列 顺序队列结构 链式队列结构 总结 栈和队列是计算机科学中常见的数据结构&#xff0c;它们都是一种线性数据结构&#xff0c;可以对元素进行快速的插入、删除和查找操作。栈…

00后工资太低,现在转行数据分析还能就业吗?,求大佬指点!

当然可以就业&#xff0c;只要专业技能过关。IT是靠技术吃饭的行业&#xff0c;没有复杂的人际关系和面子工程&#xff0c;相对其他行业要纯粹一些。当然&#xff0c;如果你技术不过关&#xff0c;或者跟不上技术更新发展速度&#xff0c;淘汰也是必然的&#xff0c;IT行业不能…

听我一句劝,千万别去外包,两年外包生涯做完,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近5年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

前端开发和测试的新伙伴:Requestly,让你事半功倍!

目录 引言 痛点 前端测试 后端测试 曾使用的应对措施 Charles Chrome 插件 实现mock工具 Requestly Requestly的功能 流量捕捉方式 请求的修改 响应的修改 请求响应录制 我对Requestly的应用 总结 引言 想必每个前端开发和测试的小伙伴都曾经历过不断地切换页…

CV界的chatgpt出现——Segment Anything能分割万物

目录 一、前言&#xff08;1&#xff09;弱人工智能&#xff08;Weak AI&#xff09;&#xff08;2&#xff09;强人工智能&#xff08;General AI&#xff09;&#xff08;3&#xff09;超人工智能&#xff08;Super AI&#xff09; 二、SAM的一些介绍2.1 模型的结构是什么&am…

React动态路由配置

目录 项目初始化 模块创建 统一导出 全局模块配置选项 核心代码 使用及效果展示 博文适用于react-router v6及以上&#xff0c;其中还有很多值得改进的地方 最近学习react的过程中&#xff0c;思考怎样实现动态路由的配置(最终实现从页面配置最终动态从数据库加载上线模…

C++解析JSON JSONCPP库的使用

首先去GitHub下载JSONCPP的源码&#xff1a; JSonCpp的源码 解压后得到&#xff1a;jsoncpp-master 文件夹 需要的是&#xff1a;jsoncpp-master\src\lib_json 目录下的所有文件和 jsoncpp-master\include\json 目录下的所有文件&#xff0c;在MFC工程目录下新建两个文件夹或…

承诺协议:定义 构造

文章目录 安全性定义方案构造基于 OWP 存在性基于 DL 假设基于 OWF 存在性基于 DDH 假设 总结 安全性定义 承诺协议&#xff08;Commitment Scheme&#xff09;是一个两阶段的两方协议。一方是承诺者&#xff08;Committer&#xff09; C C C&#xff0c;另一方是接收者&#…

网络安全怎么学?

一、怎么入门&#xff1f; 这个 Web 安全学习路线&#xff0c;整体大概半年左右&#xff0c;具体视每个人的情况而定。 &#xff08;上传一直很模糊&#xff0c;所以就没有展开了&#xff0c;需要高清版的可以在下面领取&#xff09; &#x1f449; 【一学习路线高清版一】&a…

WiFi(Wireless Fidelity)基础(八)

目录 一、基本介绍&#xff08;Introduction&#xff09; 二、进化发展&#xff08;Evolution&#xff09; 三、PHY帧&#xff08;&#xff08;PHY Frame &#xff09; 四、MAC帧&#xff08;MAC Frame &#xff09; 五、协议&#xff08;Protocol&#xff09; 六、安全&#x…

AndroidStudio-学习笔记之多级目录功能的设计与开发

多级目录功能的设计与开发 演示效果需求描述开发预计前端后端 前端开发多级目录的UI小框架前端xml前端代码---本地demo版前端代码---服务器版逻辑说明 后端开发表设计书写接口 演示效果 需求描述 根据需求&#xff0c;为用户展示多级目录(目前设计的为4级目录)&#xff0c;并在…

Win10笔记本无法正常启动代码0xc0000001解决方法

Win10笔记本无法正常启动代码0xc0000001解决方法。最近不少的用户在笔记本电脑安装Win10系统使用时&#xff0c;出现了蓝屏的情况&#xff0c;电脑显示错误代码0xc0000001无法启动到桌面使用。那么这个情况怎么去进行问题的解决呢&#xff1f;来看看以下的解决方法吧。 准备工作…

OpenCL编程指南-4.1OpenCL C编程

使用OpenCL C编写数据并行内核 OpenCL中的数据并行性表述为一个N维计算域&#xff0c;其中N1、2或3。N-D域定义了可以并行执行的工作项的总数。下面通过一个简单的例子来了解如何用OpenCL C编写一个数据并行内核&#xff0c;将两个浮点数数组相加。这个代码的串行版本求和时需…

在windows上通过QEMU快速上手RT-thread smart

参考链接 官方文档 资料下载 env-windows-v1.3.5.7z userapps 注意事项 通过QEMU仿真不同的平台&#xff0c;使用到的交叉编译工具也不一样&#xff0c;需要将相应工具的路径添加到系统PATH里&#xff1b;或者通过CMD定位到userapps&#xff0c;运行smart-env.bat xxx&…

【jvm系列-11】jvm性能调优篇---命令行工具的基本使用

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

智能优化算法——下山单纯型算法

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、算法流程1. 反射2. 膨胀…

马哈鱼SQLFLow数据流生成介绍

马哈鱼数据血缘分析器是当前最流行的数据血缘关系(data lineage)管理工具之一&#xff0c;它是一种通过分析SQL脚本来自动发现数据流向的工具。它通过生成一个简洁的图表来显示数据仓库中表/视图和列之间的数据流。支持超过20种流行的数据库&#xff0c;包括 bigquery, couchba…

项目风险的4种应对策略及实施条件

面对威胁或可能给项目带来消极影响的风险&#xff0c;我们一般采用规避、转移、缓解和接受的应对策略。 一、风险规避 风险规避策略是指项目团队采取行动来消除威胁&#xff0c;或保护项目免受风险影响的应对策略&#xff0c;通常包括改变项目管理计划&#xff0c;以完全消除威…

super_数学知识(质数筛选和约数学习)lesson08易错题记录

文章目录 回文质数第n小的质数素数个数 回文质数 先上代码 #include<iostream> #include<vector>//创建动态数组需要的头文件 #include<cstring>//使用memset需要的头文件 using namespace std; vector<int> q; bool arr[10000005]; //埃氏筛法找出所…

详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼

目录 一.软件开发的生命周期总括 二.项目架构分类 C/S架构 B/S架构 三.详解软件需求 需求分类 需求获取 需求分析 四.详解面向对象分析&#xff08;OOA&#xff09; 概念理解&#xff1a; 统⼀建模语⾔UML UML的重要组成部分&#xff1a; ⽤例图的元素 识别参与者…