Go语言flag包解析

Go语言中的 flag 包中,提供了命令行参数解析的功能。

有关命令行参数概念

  • 命令行参数(或参数):是指运行程序时提供的参数;
  • 已定义命令行参数:是指程序中通过 flag.Type 这种形式定义了的参数;
  • 非 flag(non-flag)命令行参数(或保留的命令行参数):可以简单理解为 flag 包不能解析的参数。

flag包使用

flag.Type()

flag.Type(flag 名, 默认值, 帮助信息) *Type

示例代码

package main

import (
	"flag"
	"fmt"
)

func main() {
	// 返回的name,age,married,delay等为对应类型的指针
	name := flag.String("name", "张三", "姓名")
	age := flag.Int("age", 18, "年龄")
	married := flag.Bool("married", false, "婚否")
	delay := flag.Duration("d", 0, "时间间隔")
    
    // 设置好之后命令解析
	flag.Parse()

	// 返回的是指针,访问需使用*
	fmt.Println(*name, *age, *married, *delay)
}

运行结果(可以看到没有赋值的地方采用我们之前的默认值)

go run main.go -name="syz" -age=20 -d=0 
syz 20 false 0s

如果输入错误,会有提示信息usage

go run main.go -name="尚益州" -age=20 -d=1 
invalid value "1" for flag -d: parse error
  -age int
        年龄 (default 18) 
  -d duration
        时间间隔
  -married
        婚否
  -name string
        姓名 (default "张三")
exit status 2

可以看到提示哪个参数输入错误,也可以看到之前输入的参数的值和类型,输入的参数是否是默认参数。

支持的命令行参数格式有以下几种:

  • -flag:只支持 bool 类型;
  • -flag=x:支持所有类型
  • -flag x:只支持非 bool 类型。

flag.TypeVar()

flag.TypeVar(Type 指针, flag 名, 默认值, 帮助信息)

实例代码

package main

import (
	"flag"
	"fmt"
)

func main() {
	// 定义命令行参数
	var name string
	var age int
	var married bool
	// 使用 flag.TypeVar 方法
	flag.StringVar(&name, "name", "张三", "名字信息")
	flag.IntVar(&age, "age", 0, "年龄信息")
	flag.BoolVar(&married, "married", false, "婚恋情况")

	// 命令行参数解析
	flag.Parse()

	// 返回的是指针,访问需使用*
	fmt.Println(name, age, married) // 李四 18 false
}
go run main.go -name="李四" -age=18 -married=false  
李四 18 false

其他函数

flag.Args() //返回命令行参数后的其他参数,以[]string类型
flag.NArg() //返回命令行参数后的其他参数个数
flag.NFlag() //返回使用的命令行参数个数

实例代码

package main

import (
	"flag"
	"fmt"
)

func main() {
	// 定义命令行参数
	var name string
	var age int
	var married bool
	// 使用 flag.TypeVar 方法
	flag.StringVar(&name, "name", "张三", "名字信息")
	flag.IntVar(&age, "age", 0, "年龄信息")
	flag.BoolVar(&married, "married", false, "婚恋情况")

	// 命令行参数解析
	flag.Parse()

	// 返回的是指针,访问需使用*
	fmt.Println(name, age, married) // 李四 18 false

	fmt.Println("the number of used args is ", flag.NFlag()) // 返回使用的命令行参数个数
	fmt.Println("the number of other args ", flag.NArg())    // 返回命令行参数后的其他参数个数
	fmt.Println("the number of other args ", flag.Args())    // 返回命令行参数后的其他参数,以[]string类型
}
go run main.go -name="李四" -age=18 -married=false hello world
李四 18 false
the number of used args is  3
the number of other args  2
the number of other args  [hello world]

参考

Go语言flag包:命令行参数解析 (biancheng.net)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值