在Go语言中,flag
包用于解析命令行参数。当使用子命令时,通常需要判断哪些flag是实际由用户输入的,而不是默认值。以下是如何精确判断子命令中实际输入的flag的方法:
flag.Visit
函数flag.Visit
函数可以遍历所有实际被用户设置的flag。你可以利用这个函数来判断哪些flag是用户输入的。
package main
import (
"flag"
"fmt"
)
func main() {
// 定义子命令
subCmd := flag.NewFlagSet("sub", flag.ExitOnError)
flag1 := subCmd.String("flag1", "default1", "description of flag1")
flag2 := subCmd.String("flag2", "default2", "description of flag2")
// 解析命令行参数
if len(os.Args) < 2 {
fmt.Println("expected 'sub' subcommand")
os.Exit(1)
}
if os.Args[1] == "sub" {
subCmd.Parse(os.Args[2:])
} else {
fmt.Println("expected 'sub' subcommand")
os.Exit(1)
}
// 遍历实际设置的flag
subCmd.Visit(func(f *flag.Flag) {
fmt.Printf("Flag %s was set to %s\n", f.Name, f.Value)
})
// 输出所有flag的值
fmt.Printf("flag1: %s\n", *flag1)
fmt.Printf("flag2: %s\n", *flag2)
}
flag.Lookup
函数flag.Lookup
函数可以用来检查某个特定的flag是否被设置。你可以通过检查flag的DefValue
和Value
是否相同来判断该flag是否被用户输入。
package main
import (
"flag"
"fmt"
"os"
)
func main() {
// 定义子命令
subCmd := flag.NewFlagSet("sub", flag.ExitOnError)
flag1 := subCmd.String("flag1", "default1", "description of flag1")
flag2 := subCmd.String("flag2", "default2", "description of flag2")
// 解析命令行参数
if len(os.Args) < 2 {
fmt.Println("expected 'sub' subcommand")
os.Exit(1)
}
if os.Args[1] == "sub" {
subCmd.Parse(os.Args[2:])
} else {
fmt.Println("expected 'sub' subcommand")
os.Exit(1)
}
// 检查flag1是否被设置
if f := subCmd.Lookup("flag1"); f != nil && f.Value.String() != f.DefValue {
fmt.Printf("flag1 was set to %s\n", *flag1)
} else {
fmt.Println("flag1 was not set")
}
// 检查flag2是否被设置
if f := subCmd.Lookup("flag2"); f != nil && f.Value.String() != f.DefValue {
fmt.Printf("flag2 was set to %s\n", *flag2)
} else {
fmt.Println("flag2 was not set")
}
}
flag.VisitAll
函数flag.VisitAll
函数可以遍历所有flag,无论它们是否被设置。你可以结合flag.Visit
和flag.VisitAll
来判断哪些flag是用户输入的。
package main
import (
"flag"
"fmt"
"os"
)
func main() {
// 定义子命令
subCmd := flag.NewFlagSet("sub", flag.ExitOnError)
flag1 := subCmd.String("flag1", "default1", "description of flag1")
flag2 := subCmd.String("flag2", "default2", "description of flag2")
// 解析命令行参数
if len(os.Args) < 2 {
fmt.Println("expected 'sub' subcommand")
os.Exit(1)
}
if os.Args[1] == "sub" {
subCmd.Parse(os.Args[2:])
} else {
fmt.Println("expected 'sub' subcommand")
os.Exit(1)
}
// 遍历所有flag
subCmd.VisitAll(func(f *flag.Flag) {
if f.Value.String() != f.DefValue {
fmt.Printf("Flag %s was set to %s\n", f.Name, f.Value)
} else {
fmt.Printf("Flag %s was not set (default: %s)\n", f.Name, f.DefValue)
}
})
}
flag.Visit
:遍历所有实际被用户设置的flag。flag.Lookup
:检查某个特定的flag是否被设置。flag.VisitAll
:遍历所有flag,无论它们是否被设置。通过这些方法,你可以精确判断子命令中实际输入的flag。