Golang 内建包-flag

传参的两种方式

1. os.Args

引入 “os” 包,os.Args 是一个存储命令行参数的字符串切片,它的第一个元素是执行文件的名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fmt"
"os"
)

//os.Args demo
func main() {
//os.Args 是一个[]string
if len(os.Args) > 0 {
for index, arg := range os.Args {
fmt.Printf("args[%d]=%v\n", index, arg)
}
}
}

将上面的代码执行 go build -o "args_demo" 编译之后执行:

1
2
3
4
5
6
$ ./args_demo a b c d
args[0]=./args_demo
args[1]=a
args[2]=b
args[3]=c
args[4]=d

2. flag

flag 包支持的命令行参数类型有 bool、int、int64、uint、uint64、float64、string、duration

类型 方法 返回值 备注
Bool Bool,BoolVar *bool,无 允许 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
Int Int,IntVar *int,无
Int64 Int64,Int64Var *int64,无
Uint Uint,UintVar *uint,无
Uint64 Uint64,Uint64Var *uint64,无
Float64 Float64,Float64Var *float64,无
String String,StringVar *string,无
Duration Duration,DurationVar *duration,无

1. 定义参数

1. 结果保存在指针

语法 flag.类型(参数名, 默认值, 说明信息) *类型,返回一个保存了该 flag 的值的指针,如下,此时 name、age、married、delay 均为对应类型的指针。

1
2
3
4
name := flag.String("name", "flink", "平台")
parallel := flag.Int("parallel", 5, "并行度")
quit := flag.Bool("quit", false, "静默模式")
delay := flag.Duration("d", 0, "时间间隔")

2. 绑定变量

语法 flag.TypeVar(Type指针, flag名, 默认值, 帮助信息),将 flag 的值保存到相应变量

1
2
3
4
5
6
7
8
var name string
var parallel int
var quit bool
var delay time.Duration
flag.StringVar(&name, "name", "flink", "平台")
flag.IntVar(&parallel, "parallel", 5, "并行度")
flag.BoolVar(&quit, "quit", false, "静默模式")
flag.DurationVar(&delay, "d", 0, "时间间隔")

2. 解析参数

1. flag.Parse()

支持的命令行参数格式有以下几种:

  • -flag : 只支持bool类型
  • -flag=xxx : 支持任何类型
  • -flag xxx : 只支持非bool类型
    其中,对于一个或两个 - 号,效果一样。
    flag 解析在第一个非flag参数(单个”-“不是flag参数)之前停止,或者在终止符”–”之后停止。

3. 其他函数

  • flag.NFlag() : 返回解析时进行了设置的 flag 的数量
  • flag.NArg() : 返回解析 flag 之后剩余参数的个数
  • flag.Args() : 返回解析之后剩下的非 flag 参数,以 []string 类型
  • flag.Args(i) : 返回解析之后剩下的第 i 个参数,从 0 开始索引

4. 示例

定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import (
"fmt"
"flag"
)

func main() {
//定义命令行参数方式1
var name string
var parallel int
var quit bool
var delay time.Duration
flag.StringVar(&name, "name", "flink", "平台")
flag.IntVar(&parallel, "parallel", 5, "并行度")
flag.BoolVar(&quit, "quit", false, "静默模式")
flag.DurationVar(&delay, "d", 0, "时间间隔")

//解析命令行参数
flag.Parse()
fmt.Println(name, parallel, quit, delay)

fmt.Println(flag.NFlag())
fmt.Println(flag.NArg())
fmt.Println(flag.Args())
//fmt.Println(flag.Arg(0))
}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 方式一
$ ./flag_demo -name spark --parallel 18 -quit=false -d=1h30m
spark 18 false 1h30m0s
4
0
[]


// 方式二
$ ./flag_demo a b c
flink 5 false 0s
0
3
[a b c]
a

帮助提示

1
2
3
4
5
6
7
8
9
10
$ ./flag_demo -help
Usage of ./flag_demo:
-d duration
时间间隔
-name string
平台 (default "flink")
-parallel int
并行度 (default 5)
-quit
静默模式