golang flag 包的使用指北

说起 golang 的 flag 个包,我们第一反应的是什么呢?至少我曾经第一次看到 flag 包的时候,第一反应是想起写 C 语言的时候咱们用于定义一个表示的,我们一般会命名为 flag 变量

实际上 golang 的 flag 包是用于处理命令行参数的工具包,我们可以基于这个包来开发自定义的命令行工具

对于命令行,相信大家都不陌生吧,学过 C 的就知道,如下代码是否很熟悉

int main(int argc,char **argv)
{// 打印 agrc  和 argvreturn 0;
}

其中 argc 表示命令行的参数个数, argv 二级指针表示实际的命令参数

那么,对于咱们的 golang 是如何玩的,咱们先写个 demo 看看效果

main.go

func main() {if len(os.Args) > 0 {fmt.Println("len(os.Args) == ", len(os.Args))for _, v := range os.Args {fmt.Println(v)}}
}

效果如下:

咱们 go build 输出程序名为 testFlag 的可执行程序,如下运行即可

当然需要看非常详细和全面的关于 flag 包的内容,可以直接查看官方文档 ,此处咱们是对 flag 包的介绍,平常都会使用到的一些功能,以及注意事项,分别从如下 3 个小点介绍一下常用的功能

  • 注册 flag 和 Flag 解析支持的数据类型
  • 绑定 flag 变量
  • flag.Parse() 的使用方式

注册 flag 和 Flag 解析支持的数据类型

我们可以看到上述简单 demo 演示的是咱们运行可执行程序的时候追加我们期望的参数

实际上我们使用的比较多的是在程序内部去设置 flag,例如一般写 web 服务器的时候,就会去使用 flag 包设置端口

咱们在程序中使用 flag 包,定义一个端口

通过效果,我们可看到,咱们使用 flag 包来设置命令行参数时,实际上返回的是一个指针,这个地方可别弄错了

在我们的代码中,我们可以看到 flag 包他支持这么多数据类型的注册,如下:

  • 基本的 int,int64,uint,uint64 ,整数的 flag 支持这些进制的:1234、0664、0x1234
  • 布尔值,bool , 布尔值可以这样来写:1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
  • 浮点数,float,float64
  • 字符串,string
  • 时间段 duration 也是支持的很好的,例如:我们可以设置为 100ms,1h,1us,1h25m 等等都是可以的

那么对应到咱们去设置各种数据类型的命令行参数的时候,我们就可以简单的使用 flag 包对应的函数即可,如:

port := flag.Int("port", 8866, "端口")
name := flag.String("name", "小猪", "姓名")
money := flag.Float64("money",10.36,"钱")

其他的照葫芦画瓢就可以了,这些函数的参数都是一样的效果

  • 参数1 flag 名称
  • 参数2 默认值
  • 参数3 帮助信息

这里再来敲一下黑板,上述的 port,name,money 都是指针类型的哦

绑定 flag 变量

如果用不习惯上述方式来注册 flag 的话,我们也是可以先定义一个变量,然后将命令行参数绑定到变量上,如:

var city string
var food string
var age intflag.StringVar(&city,"city","beijing","城市")
flag.StringVar(&food,"food","roast duck","美食")
flag.IntVar(&age,"age",18,"年龄")

在 flag 包中,我们可以看到也有一堆关于各种数据类型绑定变量的函数

如:flag.StringVar(&city,"city","beijing","城市")

参数类型和上述说到的类似,多了一个参数放在最前面

  • 参数1 具体的变量地址
  • 参数2 flag 名称
  • 参数3 默认值
  • 参数4 帮助信息

flag.Parse() 的使用方式

前面说了那么多的铺垫,那么我应该如何来使用呢?不可能我们都只去使用默认值吧

自然是自己开发自定义的命名行工具提供出去使用咯,这就需要咱们使用 flag.Parse() 了

flag.Parse() 来解析命令行参数写入注册的 flag 里,解析出来的是值,还是指针,这个取决于上面咱们注册 flag 的方式,再次敲黑板,此处可别弄错了

例如咱们写一个简单的 demo

此处,我们可以看到 port 是注册的自身的flag 的,port 是一个指针,所以咱们通过 flag.Parse() 之后,使用 port 时需要取地址

咱们可以参看效果如下:

编译执行可执行程序之后,我们可以看到,输出的是默认值,另外,咱们机上 --help 参数,就可以看到我们编写的帮助信息

站在使用者的角度,去使用这个工具,按照提示输入相关信息之后,我们可以看到输出的结果是我们所期望的

当然此处需要提几个注意事项:

  • 上述我们可以看到,咱们给对应的 flag 传值的时候是, -flag xxx,我们也是可以 --flag xxx,我们还可以 -flag=xxx ,同理 --flag=xxx 也是 ok 的

当然,如果对 golang 自身对于 flag 包的实现方式感兴趣的兄弟,也可以好好看看 flag 包中对于命名行参数的字符串数据解析

func (f *FlagSet) ``parseOne``() (bool, error) {

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73989.shtml

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

相关文章

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译,先设置LD_LIBRARY_PATH,再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…

TrOCR – 基于 Transformer 的 OCR 入门指南

多年来,光学字符识别 (OCR) 出现了多项创新。它对零售、医疗保健、银行和许多其他行业的影响是巨大的。尽管有着悠久的历史和多种最先进的模型,研究人员仍在不断创新。与深度学习的许多其他领域一样,OCR 也看到了变压器神经网络的重要性和影响。如今,我们拥有像TrOCR(Tran…

图论-01-图的基本表示-邻接矩阵和邻接表-Java

文章目录 邻接矩阵邻接表邻接表的问题和改进总结 邻接矩阵 import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;public class AdjMatrix {private int V;private int E;private int[][] adj;// 构造函数,从文…

App线上网络问题优化策略

在我们App开发过程中,网络是必不可少的,几乎很难想到有哪些app是不需要网络传输的,所以网络问题一般都是线下难以复现,一旦到了用户手里就会碰到很多疑难杂症,所以对于网络的监控是必不可少的,针对用户常见…

鸿蒙系列-如何使用DevEco分析app的性能

如何使用DevEco分析app的性能 性能优化、启动优化、内存优化、FPS监测、性能分析🧐 在鸿蒙OpenHarmony开发过程中,开发者开发的代码(Stage 模型)通常以调用 ArkUI 框架的代码为主,主要优化的代码部分也在其中&#x…

使用GPU虚拟化技术搭建支持3D设计的职校学生机房(云教室)

背景 学校为职业学校,计算机教室需要进行Maya、Adobe Illustrator、Adobe Dreamweaver、Adobe PhotoShop等软件的教学。每个教室为35用户。资源需求为4核、8G内存、80G硬盘。 基于桌面虚拟化VDI技术的机房在成本、可管理性方面,相对于传统胖终端的机房…

华为认证系统学习大纲及课程

前言 任何学习过程都需要一个科学合理的学习路线,才能够有条不紊的完成我们的学习目标。华为认证网络工程师所需学习的内容纷繁复杂,难度较大,所以今天特别为大家整理了一个全面的华为认证网络工程师学习大纲及课程,帮大家理清思…

更健康舒适更科技的照明体验!书客SKY护眼台灯SUKER L1上手体验

低价又好用的护眼台灯是多数人的需求,很多人只追求功能性护眼台灯,显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到,然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯,拥有高品质光源&#xff…

前端实现展开收起的效果 (react)

需求背景:需要实现文本的展开收起效果,文本是一行一行的,数据格式是数组结构。 如图所示(图片已脱敏) 简单实现:使用一个变量控制展开收起效果。 展开收起逻辑部分(react) const […

国际版腾讯云阿里云免费开户:全站加快 DCDN 重磅发布!打造新一代加快引擎

腾讯云全站加快 DCDN 重磅发布!打造新一代加快引擎 在数字化转型革新逐渐深化的当下,安全高效成为企业上云、全球化布置的要害需求。 跟着运用场景复杂度不断提高、事务需求差异化开展,为了给企业供给更完善的安全加快服务,阿里云…

【Linux】VirtualBox安装Centos7

文章目录 下载并安装VirtualBox下载Centos镜像VirtualBox设置管理->全局设定:设定虚拟机默认安装路径工具->网络管理器:添加NetWork网络配置 VirtualBox安装CentOS7新建虚拟机,指定安装目录及名称,点击下一步指定虚拟机内存…

FGO:使用chaIdea获取抽卡数据(mitmproxy抓包)

需求描述 最近逛贴吧看到好多master贴出自己的抽卡概率截图,本非洲杂鱼master也对自己的脸黑程度产生了好奇(曾经15单芭娜娜池子1五星,6单道满池子1五星,梅莉池子330抽1五星,最近的芭娜娜复刻又330抽1五星&#xff09…

Dedecms最新版--0day分享分析(二)

前言 接上一篇的Tricks,既然利用远程文件下载方式成为了实现RCE的最好方法,毕竟在执行的时候没有恶意shell文件,恶意木马被存放于远端服务器,那么下文的day就是对远程恶意文件的利用。 环境 下载最新版本: https://…

Java从入门到精通-数组(二)

4.数组的基本操作 数组的基本操作包括遍历数组、填充替换数组元素、对数组进行排序、复制数组以及查询数组中的元素。 • 4.1 遍历数组 遍历数组是访问数组中所有元素的过程,通常使用循环完成。 使用 for 循环遍历数组: int[] numbers {1, 2, 3, 4…

Datax抽取mysql的bit类型数据

背景:使用datax抽取mysql的一张表,里面有两个bit类型的字段,抽取出来显示如下: 需要在抽取reader里面进行处理配置 最终生成的datax的json文件reader的配置会转换为具体的数值 最终查询效果:

UniTask保姆级教程

目录 一、UniTask的简介和安装 https://github.com/Cysharp/UniTask.gitpathsrc/UniTask/Assets/Plugins/UniTask 空载性能测试 二、基础用法详解 三、基础用法扩展 四、进阶 五、VContainer简介 六、VContainer基础实例 方便快速查找 一、UniTask的简介和安装 项目地…

信息安全保障

文章目录 目录 文章目录 一.信息安全的定义 信息安全的概念 狭义的信息安全概念: 广义的信息安全问题: 信息系统安全问题的根源: 威胁情报 威胁情报的作用: 信息安全的特征 二.信息系统的属性 三.信息安全的视角 国家视角下的信…

Spring学习笔记——3

Spring学习笔记——3 一、AOP简介1.1、AOP概述1.2、AOP思想的实现方案1.3、模拟AOP的基础代码1.4、AOP的相关概念 二、基于XML配置的AOP2.1、XML方式AOP快速入门2.2、XML方式AOP配置详解2.3、XML方式AOP原理剖析 三、基于注解配置AOP3.1、注解方式AOP基本使用3.2、注解方式AOP配…

手写Spring:第15章-通过注解注入属性信息

文章目录 一、目标:通过注解注入属性信息二、设计:通过注解注入属性信息三、实现:通过注解注入属性信息3.1 工程结构3.2 自动扫描注入占位符配置和对象类图3.3 读取属性并填充到容器中3.3.1 定义解析字符串接口3.3.2 配置Bean工厂添加解析器3…

基于Java+SpringBoot+Vue前后端分离农产品直卖平台设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…