Golang中使用flagpackage解析命令行参数

Goflag教程展示了如何使用flagpackage解析Golang中的命令行参数。

flag包实现命令行标志解析。命令行参数在os.Args切片中可用。flag包允许它们更灵活。

此外,还有第三方软件包,例如具有额外功能的Cobra。

func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, usage string)

flag包包含多个用于解析不同标志类型的函数。每种标志类型都有两种选择。不同之处在于第一个返回指向变量的指针,另一个接受指向变量的指针。

使用flag.Args,我们可以解析非标志参数;这些必须跟在标志参数之后。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

Go标志语法

有几种写标志的选项。

-count=x
-count x
--count=x
--count x

这些适用于除布尔值之外的所有类型。

-upper
--upper
-upper=value
--upper=value

布尔标志有这些选项。

Go标志简单示例

下面的例子是一个解析整数参数的简单程序。

package main

import (
    "flag"
    "fmt"
)

func main() {
    num := flag.Int("n", 5, "# of iterations")
    flag.Parse()

    n := *num
    i := 0

    for i < n {
        fmt.Println("falcon")
        i++
    }
}

程序打印单词“falcon”n次;n值是从命令行参数中解析出来的。

import (
    "flag"
    "fmt"
)

首先,我们导入flag包。

num := flag.Int("n", 5, "# of iterations")

我们用flag.Int注册了一个int标志。第一个参数是标志的名称,第二个是默认值,第三个是标志的描述。

flag.Parse()

我们使用flat.Parse处理标志。

n := *num

因为我们使用了一个返回变量指针的函数,所以我们取消引用指针并获取值。

for i < n {
    fmt.Println("falcon")
    i++
}

我们打印了n次“falcon”这个词。

$ go run simple.go 
falcon
falcon
falcon
falcon
falcon
$ go run simple.go -n 3
falcon
falcon
falcon

Goflag.String&flag.Int

flag.String定义了一个带有指定名称、默认值和用法字符串的字符串标志。返回值是存储标志值的字符串变量的地址。flag.Int定义了一个具有指定名称、默认值和用法字符串的int标志。返回值是存储标志值的int变量的地址。

package main

import (
    "flag"
    "fmt"
)

var (
    env  *string
    port *int
)

func init() {
    env = flag.String("env", "development", "current environment")
    port = flag.Int("port", 3000, "port number")
}

func main() {

    flag.Parse()

    fmt.Println("env:", *env)
    fmt.Println("port:", *port)
}

该程序使用两个标志:环境选项和端口号。

func init() {
    env = flag.String("env", "development", "current environment")
    port = flag.Int("port", 3000, "port number")
}

我们可以将语句放在init函数中,该函数通常用于初始化状态变量。

$ go run string_int.go 
env: development
port: 3000
$ go run string_int.go -port 8080
env: development
port: 8080

Goflag.StringVar

flag.StringVar定义了一个带有指定名称、默认值和用法字符串的字符串标志。第一个参数指向一个字符串变量,用于存储标志的值。

package main

import (
    "flag"
    "fmt"
)

func main() {

    var name string
    flag.StringVar(&name, "name", "guest", "your name")
    flag.Parse()

    fmt.Printf("Hello %s\n", name)
}

该示例从命令行获取用户名。

$ go run stringvar.go 
Hello guest
$ go run stringvar.go -name Peter
Hello Peter

Goflag.PrintDefaults

集合中所有定义的命令行标志的flag.PrintDefaults默认值。

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {

    var name string
    flag.StringVar(&name, "name", "", "your name")
    flag.Parse()

    if len(name) == 0 {
        fmt.Println("Usage: defaults.go -name")
        flag.PrintDefaults()
        os.Exit(1)
    }

    fmt.Printf("Hello %s\n", name)
}

程序注册了name标志并且make是必需的。

if len(name) == 0 {
    fmt.Println("Usage: defaults.go -name")
    flag.PrintDefaults()
    os.Exit(1)
}

如果name变量为空,我们打印程序的用法。

$ go run defaults.go 
Usage: defaults.go -name
    -name string
        your name
exit status 1

去标志.BoolVar

flag.BoolVar定义了一个带有特定名称、默认值和用法字符串的bool标志。第一个参数指向一个bool变量,用于存储标志的值。

package main

import (
    "flag"
    "fmt"
    "strings"
)

func main() {

    var name string
    var upper bool

    flag.StringVar(&name, "name", "guest", "your name")
    flag.BoolVar(&upper, "u", false, "display in uppercase")
    flag.Parse()

    var msg string

    msg = fmt.Sprintf("Hello %s", name)

    if upper {
        fmt.Println(strings.ToUpper(msg))

    } else {

        fmt.Println(msg)
    }
}

该程序采用用户名和是否以大写形式写入消息的布尔标志。

$ go run boolean.go -name Peter
Hello Peter
$ go run boolean.go -name Peter -u
HELLO PETER

Goflag.Args

标志后面的参数可用作切片flag.Args或单独用作flag.Arg(i)。参数从0到flag.NArg()-1进行索引。

package main

import (
    "flag"
    "fmt"
    "os"
    "strings"
)

func main() {

    var u bool
    flag.BoolVar(&u, "u", false, "display in uppercase")
    flag.Parse()

    values := flag.Args()

    if len(values) == 0 {
        fmt.Println("Usage: nonflags.go [-u] words ...")
        flag.PrintDefaults()
        os.Exit(1)
    }

    for _, word := range values {

        if u {

            fmt.Println(strings.ToUpper(word))
        } else {

            fmt.Println(word)
        }
    }
}

程序有u标志,它以大写形式打印标志后面的所有单词。

flag.BoolVar(&u, "u", false, "display in uppercase")

我们定义布尔标志。

values := flag.Args()

我们从终端获取所有的单词。

for _, word := range values {

    if u {

        fmt.Println(strings.ToUpper(word))
    } else {

        fmt.Println(word)
    }
}

我们遍历切片并打印单词;如果我们设置了大写标志,则单词将以大写形式打印。

$ go run nonflags.go sky blue falcon cup ocean
sky
blue
falcon
cup
ocean
$ go run nonflags.go -u sky blue falcon cup ocean
SKY
BLUE
FALCON
CUP
OCEAN

在本教程中,我们使用标志包解析了Golang中的命令行参数。

列出所有Go教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏