Go语言----flag包(导入、配置、以及常用方法Parse()、Parsed()、NArg())

在 Go语言中有很多种方法来处理命令行参数。如果我们只是想简单的获取命令行的参数,可以像Go语言–延迟调用defer、获取命令行参数、局部变量以及全局变量中介绍的不使用任何库,直接使用 os.Args;
在这里插入图片描述d但是 Golang 的标准库提供了 flag 包来处理命令行参数。

导入包

import flag

flag参数类型

flag包支持的命令行参数类型有bool、int、int64、uint、uint64、float、float64、string、duration。

flag参数有效值
字符串flag合法字符串
整数flag1234、0664、0x1234等类型,也可以是负数。
浮点数flag合法浮点数
bool类型flag1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。
时间段flag可以接受任何可以被time.ParseDuration转换的参数

配置flag

func XXX(name string, value xxx, usage string) *xxx
func XXXVar(p *xxx, name string, value xxx, usage string)
  • XXX为各个类型名,有:bool、duration、float64、int64、int、uint、uint64、string等.
  • name string为flag名—name区分大小写
  • value xxx为默认值
  • usage string为帮助信息
  • p *xxx为Type指针

即如下内容:

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

两者区别

  • 前者直接返回指向对应类型指针并分配对应指针指向的对象,可以直接通过解引用来获取转换后的对应值
  • 后者需要指定指针指向的对象.

例如

定义姓名、年龄、婚否三个命令行参数:

name := flag.String("name", "张三", "姓名")
age := flag.Int("age", 18, "年龄")
married := flag.Bool("married", false, "婚否")
delay := flag.Duration("d", 0, "时间间隔")

此时name、age、married、delay均为对应类型的指针。

或者:

var name string
var age int
var married bool
var delay time.Duration
flag.StringVar(&name, "name", "张三", "姓名")
flag.IntVar(&age, "age", 18, "年龄")
flag.BoolVar(&married, "married", false, "婚否")
flag.DurationVar(&delay, "d", 0, "时间间隔")

flag常用方法

Parse()–设置完各种配置后调用此方法

用来实际触发转换的。底层实际上就是转换了命令行从第二个开始的所有参数。

  • 如果有转换失败的情况,则会直接导致程序退出,并像标准输出打印错误原因。
  • 如果输入的是-help或-h,且没有直接配置,则会输出使用帮助。

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

-flag xxx (使用空格,一个-符号)
--flag xxx (使用空格,两个-符号)
-flag=xxx (使用等号,一个-符号)
--flag=xxx (使用等号,两个-符号)

其中,布尔类型的参数必须使用等号的方式指定。

Parsed()–调用过Parse()进行转换后,Parsed()返回true,否则返回false

Args

处理完flag后,后面的参数都会当作普通参数处理。

  • 可NArg()查看普通参数的个数;
  • func Arg(i int) string来访问其中某个参数。
for i := 0; i < flag.NArg(); i++ {
		fmt.Printf("%d:%s\n", i, flag.Arg(i))
	}
  • func Args() []string来一次性取回所有的参数。
for i, arg := range flag.Args() {
	fmt.Printf("%d:%s\n", i, arg)
}

实例

package main

import (
	"flag"
	"fmt"
	"time"
)

func main() {
	//定义命令行参数方式1
	var name string
	var age int
	var married bool
	var delay time.Duration
	flag.StringVar(&name, "name", "张三", "姓名")
	flag.IntVar(&age, "age", 18, "年龄")
	flag.BoolVar(&married, "married", false, "婚否")
	flag.DurationVar(&delay, "d", 0, "延迟的时间间隔")

	//解析命令行参数
	flag.Parse()
	fmt.Println(name, age, married, delay)
	//返回命令行参数后的其他参数
	fmt.Println(flag.Args())
	//返回命令行参数后的其他参数个数
	fmt.Println(flag.NArg())

	//访问其中某个参数
	for i, arg := range flag.Args() {
		fmt.Printf("%d:%s\n", i, arg)
	}

	//返回使用的命令行参数个数
	fmt.Println(flag.NFlag())
}

在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值