go 内建模块学习之 flag

201 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

flag

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

类型方法返回值备注
BoolBool,BoolVar*bool,无允许 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
IntInt,IntVar*int,无
Int64Int64,Int64Var*int64,无
UintUint,UintVar*uint,无
Uint64Uint64,Uint64Var*uint64,无
Float64Float64,Float64Var*float64,无
StringString,StringVar*string,无
DurationDuration,DurationVar*duration,无

1. 定义参数

1. 结果保存在指针

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

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 的值保存到相应变量

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. 示例

定义

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))
}

使用

// 方式一
$ ./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

帮助提示

$ ./flag_demo -help
Usage of ./flag_demo:
  -d duration
        时间间隔
  -name string
        平台 (default "flink")
  -parallel int
        并行度 (default 5)
  -quit
        静默模式