使用全局pflag
获取选项参数
package main
import (
"fmt"
"github.com/spf13/pflag"
)
var (
name string
age int
weight *int
height *int
)
func init() {
// 支持长选项、短选项、默认值和使用文本,并将标志的值绑定到变量。
pflag.StringVarP(&name, "name", "n","null", "Input Your Name")
// 支持长选项、默认值和使用文本,并将标志的值绑定到变量。
pflag.IntVar(&age, "age", 0, "Input Your Age")
// 支持长选项、默认值和使用文本,并将标志的值存储在指针中
weight = pflag.Int("weight", 0, "Input Your Weight")
// 支持长选项、短选项、默认值和使用文本,并将标志的值存储在指针中
height = pflag.IntP("height", "h", 0, "Input Your Weight")
// 函数名带Var说明是将标志的值绑定到变量,否则是将标志的值存储在指针中。
// 函数名带P说明支持短选项,否则不支持短选项。
}
func main() {
pflag.Parse()
// 如果有必须填的参数没有填,打印帮助文档
if age == 0 || *weight == 0{
pflag.PrintDefaults()
return
}
fmt.Println(name)
fmt.Println(age)
fmt.Println(*weight)
fmt.Println(*height)
}
运行时指定参数
% go run main.go -n xx --weight 10 -h 20
xx
0
10
20
获取非选项参数
package main
import (
"fmt"
"github.com/spf13/pflag"
)
var (
number = pflag.Int("", 1234, "help message for number")
)
func main() {
pflag.Parse()
fmt.Printf("argument number is: %v\n", pflag.NArg())
fmt.Printf("argument list is: %v\n", pflag.Args())
fmt.Printf("the first argument is: %v\n", pflag.Arg(0))
fmt.Println(*number)
}
运行时指定参数
% go run main.go xx yy zz
argument number is: 3
argument list is: [xx yy zz]
the first argument is: xx
1234
指定选项但不指定选项值
package main
import (
"fmt"
"github.com/spf13/pflag"
)
var (
number *int
)
func init() {
number = pflag.IntP("number", "n", 1, "help message")
pflag.Lookup("number").NoOptDefVal = "2"
}
func main() {
pflag.Parse()
fmt.Println(*number)
}
运行时指定参数并指定值时number等于指定的值,不指定参数值为默认值1,指定参数但不指定值,如下所示,此时number=2,这种方法要用-n=xx格式赋值,不能使用-n xx格式,更多格式pflag package - github.com/spf13/pflag - pkg.go.dev
% go run main.go -n=10
10
弃用标志或标志的简写
func init() {
number = pflag.IntP("number", "n", 1, "help message")
pflag.Lookup("number").NoOptDefVal = "2"
_ = pflag.CommandLine.MarkDeprecated("number", "please use --number-my instead")
}
运行时指定参数
% go run main.go -n=10
Flag --number has been deprecated, please use --number-my instead
弃用简写
pflag.CommandLine.MarkShorthandDeprecated("number", "please use --number only")
隐藏标识
将 Flag 标记为隐藏的,这意味着它仍将正常运行,但不会显示在 usage/help 文本中
pflag.CommandLine.MarkHidden("number")