Go 之 flag 命令行参数

Go 获取命令行参数的方法:

1. os.Args,类似于 Python 的 os.args,返回一个数组

2. Go 内置的 flag 包,支持基本的参数选项类型

3. 第三方 go-flags,GitHub 地址:https://github.com/jessevdk/go-flags。相比标准库flag支持更丰富的数据类型!格式化友好,通过结构体绑定、反射提供参数选项

示例:

package main

import (
	"flag"
	"fmt"
	"github.com/jessevdk/go-flags"
	"os"
	"time"
)

/*
os.Args获取命令行参数,是一个[]string,它的第一个元素是执行文件的名称。
os.Args是一个存储命令行参数的字符串切片,
*/
func useOsArgs() {
	argsSlice := os.Args
	if len(argsSlice) > 0 {
		for index, args := range argsSlice {
			fmt.Printf("args[%d]=%v\n", index, args)
		}
	}
}

/*
 */
func flagArgs() {
	// 两种常用的定义命令行flag参数的方法。
	// 1. flag.Type(flagName, value, desc) *Type
	// name1 := flag.String("name", "张三", "姓名")
	// age1 := flag.Int("age", 18, "年龄")
	// married1 := flag.Bool("married", false, "婚否")
	// delay1 := flag.Duration("d", 0, "时间间隔")

	// 2. flag.TypeVar(Type指针, flag名, 默认值, 帮助信息)
	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参数后,需要通过调用flag.Parse()来对命令行参数进行解析。
	flag.Parse()
	// 支持的命令行参数格式有以下几种:
	// 	-flag xxx (使用空格,一个-符号)
	// 	--flag xxx (使用空格,两个-符号)
	// 	-flag=xxx (使用等号,一个-符号)
	// 	--flag=xxx (使用等号,两个-符号)

	// Flag解析在第一个非flag参数(单个”-“不是flag参数)之前停止,或者在终止符”–“之后停止。
	fmt.Println(name, age, married, delay)
	// 返回命令行参数后的其他参数,以[]string类型
	flag.Args()
	// 返回命令行参数后的其他参数个数
	flag.NArg()
	// 返回使用的命令行参数个数
	flag.NFlag()
}

/**
go-flags

go-flags相比标准库flag支持更丰富的数据类型:
	所有的基本类型(包括有符号整数int/int8/int16/int32/int64,无符号整数uint/uint8/uint16/uint32/uint64,浮点数float32/float64,布尔类型bool和字符串string)和它们的切片;
	map 类型。只支持键为string,值为基础类型的 map;
	函数类型。
*/

type Option struct {
	IntFlag        int            `short:"i" long:"int" description:"int flag value"`
	IntSlice       []int          `long:"intslice" description:"int slice flag value"`
	BoolFlag       bool           `long:"bool" description:"bool flag value"`
	BoolSlice      []bool         `long:"boolslice" description:"bool slice flag value"`
	FloatFlag      float64        `long:"float" description:"float64 flag value"`
	FloatSlice     []float64      `long:"floatslice" description:"float64 slice flag value"`
	StringFlag     string         `short:"s" long:"string" description:"string flag value"`
	StringSlice    []string       `long:"strslice" description:"string slice flag value"`
	PtrStringSlice []*string      `long:"pstrslice" description:"slice of pointer of string flag value"`
	Call           func(string)   `long:"call" description:"callback"`
	IntMap         map[string]int `long:"intmap" description:"A map from string to int"`
}

func goFlags() {
	var opt Option
	opt.Call = func(value string) {
		fmt.Println("in callback: ", value)
	}

	_, err := flags.Parse(&opt)
	if err != nil {
		fmt.Println("Parse error:", err)
		return
	}

	fmt.Printf("int flag: %v\n", opt.IntFlag)
	fmt.Printf("int slice flag: %v\n", opt.IntSlice)
	fmt.Printf("bool flag: %v\n", opt.BoolFlag)
	fmt.Printf("bool slice flag: %v\n", opt.BoolSlice)
	fmt.Printf("float flag: %v\n", opt.FloatFlag)
	fmt.Printf("float slice flag: %v\n", opt.FloatSlice)
	fmt.Printf("string flag: %v\n", opt.StringFlag)
	fmt.Printf("string slice flag: %v\n", opt.StringSlice)
	fmt.Println("slice of pointer of string flag: ")
	for i := 0; i < len(opt.PtrStringSlice); i++ {
		fmt.Printf("\t%d: %v\n", i, *opt.PtrStringSlice[i])
	}
	fmt.Printf("int map: %v\n", opt.IntMap)
}

func main() {
	// useOsArgs()
	// flagArgs()

	goFlags()
	// go build -o goFlag goFlag.go
	// ./goFlag --int 42 --intslice 1 --intslice 2 --intslice 3 --bool --boolslice true --boolslice false --boolslice true --float 3.14 --floatslice 1.1 --floatslice 2.2 --floatslice 3.3 --string "hello" --strslice "one" --strslice "two" --strslice "three" --intmap key1:100 --intmap key2:200
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值