「这是我参与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…) 支持长短别名,函数回调,结构嵌套等,感兴趣的小伙伴可以看看