Go语言搬砖 flag官方标准库

「这是我参与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方法进行了简单判断,如果传入参数过少,会直接中断程度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
js复制代码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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
js复制代码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…) 支持长短别名,函数回调,结构嵌套等,感兴趣的小伙伴可以看看

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%