kevinyan815 / gocookbook

go cook book
MIT License
789 stars 167 forks source link

Go语言flag库的基本用法 #36

Open kevinyan815 opened 3 years ago

kevinyan815 commented 3 years ago

Go语言提供的flag库支持基础的命令行flag的解析。什么是命令行flag? 举个例子来说,常用的Linux命令wc -l这个-l就是wc命令支持的一个命令行flag。

下面是用Go语言的flag包编写的一个命令行Demo程序:

package main

import (
    "flag"
    "fmt"
)

func main() {

    wordPtr := flag.String("word", "Jude", "a string")

    numbPtr := flag.Int("numb", 42, "an int")
    boolPtr := flag.Bool("fork", false, "a bool")

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

    flag.Parse()

    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

使用flag包可以为程序声明字符串型、数字型、布尔型的命令行flag。

要使用制作的命令行程序,先把程序编译成二进制命令文件:

go build -o {目标目录}/go-cli-flags  {源文件目录}/{源文件.go}

执行命令时为每个flag指定值:

$ ./go-cli-flags -word=opt -numb=7 -fork -svar=flag

// 下面是命令执行后的输出
word: opt
numb: 7
fork: true
svar: flag
tail: []

执行命令时被忽略的flag会自动使用定义flag时指定的默认值。

$ ./go-cli-flags -word=opt

word: opt
numb: 42
fork: false
svar: bar
tail: []

执行命令时,在flag后可以传递任意多个位置实参

$ ./go-cli-flags -word=opt a1 a2 a3
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3]

注意,flag包要求执行命令时所有命令行flag参数都要出现在位置实参的前面,否则命令行flag参数将会被理解成位置实参,比如下面这样

$ ./go-cli-flags -word=opt a1 a2 a3 -numb=7

word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

使用-h或者--help可以获取自动为命令行程序生成的帮助文本

$ ./go-cli-flags  -h
Usage of ./go-cli-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

如果在执行程序时提供了程序未指定的flag,程序会报告错误信息并展示帮助文本。

$ ./go-cli-flags -wat
flag provided but not defined: -wat
Usage of ./go-cli-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

更多用flag库编写CLI程序的例子:https://www.digitalocean.com/community/tutorials/how-to-use-the-flag-package-in-go