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教程。
