golang flag包的使用教程

 更新时间:2023年09月10日 08:46:18   作者:阿兵云原生  
golang 的 flag 包是用于处理命令行参数的工具包,我们可以基于这个包来开发自定义的命令行工具,下面小编就来为大家介绍一下flag包的具体使用吧

前言

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

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

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

int main(int argc,char **argv)
{
    // 打印 agrc  和 argv
        return 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 int
flag.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) {

以上就是golang flag包的使用教程的详细内容,更多关于golang flag包的资料请关注脚本之家其它相关文章!

相关文章

  • golang踩坑实战之channel的正确使用方式

    golang踩坑实战之channel的正确使用方式

    Golang channel是Go语言中一个非常重要的特性,除了用来处理并发编程的任务中,它还可以用来进行消息传递和事件通知,这篇文章主要给大家介绍了关于golang踩坑实战之channel的正确使用方式,需要的朋友可以参考下
    2023-06-06
  • Go语言的JSON处理详解

    Go语言的JSON处理详解

    json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好。
    2018-10-10
  • 浅析如何利用Go的plugin机制实现热更新

    浅析如何利用Go的plugin机制实现热更新

    热更新,或称热重载或动态更新,是一种软件更新技术,允许程序在运行时,不停机更新代码或资源,本文主要来讨论下GO语言是否可以利用plugin机制实现热更新,感兴趣的可以了解下
    2024-04-04
  • Go使用select切换协程入门详解

    Go使用select切换协程入门详解

    这篇文章主要为大家介绍了Go使用select切换协程入门详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Golang 断言与闭包使用解析

    Golang 断言与闭包使用解析

    这篇文章主要介绍了Golang 断言与闭包使用解析,Go中的断言用于判断变量的类型,更多相关内容需要的朋友可以参考一下
    2022-07-07
  • Golang标准库os/exec执行外部命令并获取其输出包代码示例

    Golang标准库os/exec执行外部命令并获取其输出包代码示例

    这篇文章主要为大家介绍了Golang标准库os/exec执行外部命令并获取其输出包代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Golang 空map和未初始化map的注意事项说明

    Golang 空map和未初始化map的注意事项说明

    这篇文章主要介绍了Golang 空map和未初始化map的注意事项说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言中的Struct结构体

    Go语言中的Struct结构体

    这篇文章介绍了Go语言中的Struct结构体,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go语言Http调用之Post请求详解

    Go语言Http调用之Post请求详解

    前文我们介绍了如何进行 HTTP 调用,并通过 GET 请求的例子,讲述了 query 参数和 header 参数如何设置,以及响应体的获取方法。 本文继上文,接下来会通过 POST 请求,对其他参数的设置进行介绍,感兴趣的可以了解一下
    2022-12-12
  • gin自定义中间件解决requestBody不可重复读问题(最新推荐)

    gin自定义中间件解决requestBody不可重复读问题(最新推荐)

    这篇文章主要介绍了gin自定义中间件解决requestBody不可重复读问题,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论