go命令行解析 flag包
程序员文章站
2022-07-16 12:46:36
...
go语言 命令行解析 flag包
go : flag 包简介
在 Golang 程序中有很多种方法来处理命令行参数。简单的情况下可以不使用任何库,直接处理 os.Args;其实 Golang 的标准库提供了 flag 包来处理命令行参数
入门demo
package main
import "flag"
import "fmt"
// 定义命令行参数对应的变量,这三个变量都是指针类型
var Name = flag.String("name", "xiaoli", "Input Your Name")
var Age = flag.Int("age", 24, "Input Your Age")
var Gender = flag.String("gender", "m", "Input Your Gender")
// 定义一个值类型的命令行参数变量,在 Init() 函数中对其初始化
// 因此,命令行参数对应变量的定义和初始化是可以分开的
var Flag int
func Init() {
flag.IntVar(&Flag, "flagname", 1234, "Just for demo")
}
func main() {
// 初始化变量 cliFlag
Init()
// 把用户传递的命令行参数解析为对应变量的值
flag.Parse()
// flag.Args() 函数返回没有被解析的命令行参数
// func NArg() 函数返回没有被解析的命令行参数的个数
fmt.Printf("args=%s, num=%d\n", flag.Args(), flag.NArg())
for i := 0; i != flag.NArg(); i++ {
fmt.Printf("arg[%d]=%s\n", i, flag.Arg(i))
}
// 输出命令行参数
fmt.Println("name=", *Name)
fmt.Println("age=", *Age)
fmt.Println("gender=", *Gender)
fmt.Println("flagname=", Flag)
}
运行结果显示如下(参数顺序无所谓哒)
当我敲错了一个参数时返回的结果
到目前为止大家可能觉得没感觉到它的功能强大之处
下面为大家介绍
flag.NewFlagSet函数
NewFlagSet() 用于实例化 FlagSet。预定义的 FlagSet 实例 CommandLine 的定义方式:
portCommand := flag.NewFlagSet("port", flag.ExitOnError)
//routeCommand 设为是多维命令解析
routeCommand := flag.NewFlagSet("route", flag.ExitOnError)
port_Name:= portCommand.String("name","","Port name ")
port_Type:= portCommand.String("type","","Port type ")
routeTextPtr:= routeCommand.String("text", "", "Text to parse.")
routeMetricPtr:= routeCommand.String("metric", "chars", "Metric <chars|words|lines>.")
//导入os包后
// os.Arg[0] 是主命令
// os.Arg[1] 是子命令
if len(os.Args) < 2 {
fmt.Println("route or port subcommand is required")
os.Exit(1)
}
// 可以通过switch case来做判断
// FlagSet.Parse() 和flag.Parse() 效果相同解析各个变量
switch os.Args[1] {
case "route":
routeCommand.Parse(os.Args[2:])
case "port":
switch os.Args[2]{
case "add":
portCommand.Parse(os.Args[3:])
case "del":
portCommand.Parse(os.Args[3:])
}
default:
flag.PrintDefaults()
os.Exit(1)
}
}
进一步判断是否被设置过可以根据是否是默认值来判断
或者使用flag库中Visit函数判断
if routeCommand.Parsed() {
// Required Flags
if *routeTextPtr == "" {
routeCommand.PrintDefaults()
os.Exit(1)
}
// If the metric flag is substring, the substring flag is required
if *routeMetricPtr == "substring" && *routeSubstringPtr == "" {
routeCommand.PrintDefaults()
os.Exit(1)
}
//If the metric flag is not substring, the substring flag must not be used
if *routeMetricPtr != "substring" && *routeSubstringPtr != "" {
fmt.Println("--substring may only be used with --metric=substring.")
routeCommand.PrintDefaults()
os.Exit(1)
}
//Choice flag
metricChoices := map[string]bool{"chars": true, "words": true, "lines": true, "substring": true}
if _, validChoice := metricChoices[*routeMetricPtr]; !validChoice {
routeCommand.PrintDefaults()
os.Exit(1)
}
// Print
fmt.Printf("textPtr: %s, metricPtr: %s, uniquePtr: %t\n", *routeTextPtr, *routeMetricPtr, *routeUniquePtr)
}
致谢
谢谢观看 有问题在下方留言哈
上一篇: Sqlmap命令行参数解析(一)
下一篇: LintCode题目:幸运数字8