go命令行解析 flag包

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)
    }

致谢

谢谢观看 有问题在下方留言哈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Go语言中的flag提供了一种方便的方式来解析命令行参数。它可以将命令行参数解析为Go语言中的变量,并提供了一些选项来设置默认值、帮助信息等。 下面是一个简单的示例,演示如何使用flag解析命令行参数: ```go package main import ( "flag" "fmt" ) func main() { // 定义命令行参数 var name string var age int var married bool flag.StringVar(&name, "name", "张三", "姓名,默认张三") flag.IntVar(&age, "age", 18, "年龄,默认18") flag.BoolVar(&married, "married", false, "婚否,默认false") // 解析命令行参数 flag.Parse() // 输出命令行参数 fmt.Printf("姓名:%s\n", name) fmt.Printf("年龄:%d\n", age) fmt.Printf("婚否:%v\n", married) } ``` 在这个示例中,我们使用了`flag.StringVar`、`flag.IntVar`和`flag.BoolVar`来定义命令行参数,分别对应字符串、整数和布尔类型。这些函数都接受三个参数:一个指向变量的指针,参数名称和参数默认值。我们还可以使用`flag.Parse()`来解析命令行参数,并在程序中使用这些参数。 在命令行中运行这个程序,可以使用以下命令行参数: ```shell ./example -name=李四 -age=20 -married=true ``` 这将输出: ``` 姓名:李四 年龄:20 婚否:true ``` 我们还可以使用`flag.Usage`来设置命令行帮助信息,例如: ```go flag.Usage = func() { fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS]\n", os.Args[0]) flag.PrintDefaults() } ``` 这将在命令行中运行程序时显示帮助信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值