Golang命令行参数 -- flag

flag 包实现命令行标志解析

用法:

使用 flag.String(), Bool(), Int() 等等定义标志
这声明一个整型标志,-flagname, 存储在指针 ip中,类型为 *int

import "flag"
var ip = flag.Int("flagname", 1234, "help message for flagname")

如果你喜欢,你可以绑定标志到一个变量上,使用 Var() 函数

var flagvar int
func init() {
	flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
}

或者您可以创建满足Value接口(带指针接收器)的自定义标志,并将它们耦合到标记解析。自己需要定义变量类型,并实现 Value 的接口

flag.Var(&flagVal, "name", "help message for flagname")

对于这样的 flags ,默认值就是该变量的初始值
在所有 flags 被定义后,调用:

flag.Parse()

解析命令行到定义的 flag 中。
标志或许在后面直接被使用,如果你使用标志本身,他们都是指针;如果你绑定到变量,它们都是值。

fmt.Println("ip has value ", *ip)
fmt.Println("falgVar has value ", flagvar)

在解析后,位于标志之后的参数可以通过 flag.Args() 参数访问或通过 flag.Args(i) 分别访问,参数索引从0开始,以 flag.NArg()-1结束。

完整示例(官方示例):

package main

import (
	"flag"
	"fmt"
	"strings"
)

var name = flag.String("name", "张三", "学生的姓名")

var major string

func init() {
	const (
		defaultMajor = "计算机"
		usage        = "学生的专业"
	)
	flag.StringVar(&major, "major", defaultMajor, usage)
	flag.StringVar(&major, "m", defaultMajor, usage+" (简写)")
}

type Classmates []string

func (i *Classmates) String() string {
	return fmt.Sprint(*i)
}

func (i *Classmates) Set(value string) error {
	for _, dt := range strings.Split(value, ",") {
		*i = append(*i, dt)
	}
	return nil
}

var mates Classmates

func init() {
	flag.Var(&mates, "class", "逗号分隔的同学列表")
}

func main() {
	flag.Parse()
	fmt.Println("name ", *name)
	fmt.Println("major ", major)
	fmt.Println("classmates ", mates)
}

运行结果如下:

➜  person go build myflag.go
➜  person ./myflag -h
Usage of ./myflag:
  -class value
    	逗号分隔的同学列表
  -m string
    	学生的专业 (简写) (default "网络")
  -major string
    	学生的专业 (default "网络")
  -name string
    	学生的姓名 (default "张三")
➜  person
➜  person ./myflag -class 李四,王五,赵六 -m 数学 -name 王二小
name  王二小
major  数学
classmates  [李四,王五,赵六]
➜  person
➜  person ./myflag --class 李四,王五,赵六 --major=数学 -name=王二小
name  王二小
major  数学
classmates  [李四,王五,赵六]
➜  person

命令行标志语法

下列的样式是允许的:

-flag
-flag=x
--flag x // 仅允许非布尔标志
--flag=x

一个或两个 “-” 可以被使用,它们是等效的。下面的那个样式不可以使用布尔标志,因为下面命令的意义

cmd -x *

此处的 * 是一个Unix shell 的通配符,如果有一个名为0,false等的文件,则会更改。您必须使用-flag = false表单来关闭布尔标志。
标志解析在第一个非标志处前停止("-" 是一 个非标志参数)或终止符“ - ”之后停止。 整数标志接受1234,0664,0121234并且可以是负数。布尔标志可能是:

1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False

持续时间标志接受对time.ParseDuration有效的任何输入
默认的命令行标志集由顶级函数控制。 FlagSet类型允许定义独立的标志集,例如在命令行界面中实现子命令。FlagSet的方法类似于命令行标志集的顶级函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值