Go语言搬砖 flag官方标准库

744 阅读2分钟

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战」。

前言

flag是官方出的命令行参数解析标准库, 让编写命令行工具更加简单

特点

  • 支持参数类型string、bool、int、int64、uint、uint64、float float64、duration等
  • 支持自定义参数key名
  • 支持参数简单判断(参数长度)
  • 支持返回指针类型或数据类型
  • 自带帮助命令(-h)

例子

博主通常情况用flag.TypeVar的方式比较多,因为flag.Type返回指针类型,使用时需要带着星号(*),容易忘记,且代码编辑器也不提示语法错误

flag.TypeVar例子

TypeVar格式:类型指针,参数key名(长或短都行),默认值(int,bool不能为空)String可以为空,帮助信息

NFlag方法进行了简单判断,如果传入参数过少,会直接中断程度

package main

import (
   "flag"
   "log"
)

func main() {
   var file string
   var name string
   var ssl bool
   flag.StringVar(&file, "f", "", "需要上传的文件")
   flag.StringVar(&name, "n", "", "上传后名称")
   flag.BoolVar(&ssl, "s", false, "开关,默认关闭")
   flag.Parse()

   if flag.NFlag() < 2 {
      log.Println(flag.NFlag())
      log.Fatalln("最少传2个参数!!!")
   }
   log.Println(file,name,ssl)
}

使用方式: ./main -f etc.conf -n nginx

使用方式: ./main -f etc.conf -n nginx -s true

flag.Type例子

Type格式:参数key名(长或短都行),默认值(int,bool,duration不能为空)String可以为空,帮助信息

这里利用了os.Args来进行参数个数判断。。其实NFlag方法源码也是基于的os.Args

Type方法会返回指针类型,所以需要变量接收,变量在使用时也带个星号*(*name)

package main

import (
   "flag"
   "log"
   "os"
)

func main() {

   message := flag.String("message", "", "消息通知")
   number := flag.Int("number",0,"发送数量,默认0条")
   status := flag.Bool("status",false,"通知开关,默认关闭")
   delay := flag.Duration("delay",0,"是否延迟,默认关闭")
   flag.Parse()

   if len(os.Args) < 4 {
      log.Println(len(os.Args))
      log.Fatalln("最少传4个参数!!!")
   }
   log.Println(*message,*number,*status,delay)
}

使用方式: ./main -message hello -number 1

使用方式: ./main -message hello -number 1 -status true -delay 5

小结

flag用于编写简单的命令行工具完全能满足需求,且是官方出品,打包后体积很小

当然还有大佬出的增强型flag工具(github.com/jessevdk/go…) 支持长短别名,函数回调,结构嵌套等,感兴趣的小伙伴可以看看