Go:flag

时间:Feb. 15, 2020 分类:

目录:

使用os包实现参数传递

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Printf("%v\n", os.Args)
    fmt.Printf("%T\n", os.Args)
}

执行一下

$ go run main.go why
[/tmp/go-build106941462/b001/exe/main why]
[]string

可以看到os.Args是一个存储命令行参数的字符串切片

flag

更多参考文档

flag支持的命令行参数

类型有bool、int、int64、uint、uint64、float float64、string、duration

flag参数 有效值
字符串 合法字符串
整数 1234,0664,0x1234等,也可以是负数
浮点型 合法浮点数
bool 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
时间段 任何合法的时间段字符串。如300ms-1.5h2h45m。合法的单位有nsusµsmssmh

flag.Type()

package main

import (
    "fmt"
    "flag"
)

func main() {
    // 创建标志位参数
    name := flag.String("name", "why", "请输入名字")
    age := flag.Int("age", 26, "请输入年龄")
    married := flag.Bool("married", false, "婚否")
    delay := flag.Duration("d", 0, "时间间隔")
    // 使用flag
    flag.Parse()
    fmt.Println(*name)
    fmt.Println(*age)
    fmt.Println(*married)
    fmt.Println(*delay)
}

执行一下

$ go run main.go 
why
26
false
0s

通过标志位的方式制定参数

$ go run main.go --name "王宏宇"
王宏宇
26
false
0s

支持的命令行参数

  • -flag xxx
  • --flag xxx
  • -flag=xxx
  • --flag=xxx

也可以通过先创建变量的方式

package main

import (
    "fmt"
    "flag"
)

func main() {
    // 创建标志位参数
    var name string
    flag.StringVar(&name, "name", "why", "请输入名字")
    // 使用flag
    flag.Parse()
    fmt.Println(name)
}

其他参数

package main

import (
    "fmt"
    "flag"
)

func main() {
    // 创建标志位参数
    name := flag.String("name", "why", "请输入名字")
    age := flag.Int("age", 26, "请输入年龄")
    married := flag.Bool("married", false, "婚否")
    delay := flag.Duration("d", 0, "时间间隔")
    // 使用flag
    flag.Parse()
    fmt.Println(*name)
    fmt.Println(*age)
    fmt.Println(*married)
    fmt.Println(*delay)
    //返回命令行参数后的其他参数
    fmt.Println(flag.Args())
    //返回命令行参数后的其他参数个数
    fmt.Println(flag.NArg())
    //返回使用的命令行参数个数
    fmt.Println(flag.NFlag())
}

执行一下

$ go run main.go --name="王宏宇" -age 3 why
王宏宇
3
false
0s
[why]
1
2