加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang---命令源码文件与命令行参数

发布时间:2020-12-16 09:21:00 所属栏目:大数据 来源:网络整理
导读:命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的。 ? import "flag"? flag包实现了命令行参数的解析。每个参数认为一条记录,根据实际进行定义,到一个set集合。每条都有各自的状态参数。 在使用flag时正常流程:? 1.? 通过flag.String(),f

命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的。

?

import "flag"?

flag包实现了命令行参数的解析。每个参数认为一条记录,根据实际进行定义,到一个set集合。每条都有各自的状态参数。

在使用flag时正常流程:?

1.?通过flag.String(),flag.Bool(),flag.Int()等函数来定义命令行中需要使用的参数。

2.?在定义完flag后,通过调用flag.Parse()来进行对命令行参数的解析。

3.?获取flag.String(),flag.Int()等方法的返回值,即对应用户输入的参数.

 注意的是flag.Xxx()返回的值是变量的内存地址,要获取值时要通过在变量前加*(星号)获取.

?

说明:
像flag.Int、flag.Bool、flag.String这样的函数格式都是一样的,调用的时候需要传入3个参数
参数的说明如下:
第一个arg表示参数名称,在控制台的时候,提供给用户使用.
第二个arg表示默认值,如果用户在控制台没有给该参数赋值的话,就会使用该默认值.
第三个arg表示使用说明和描述,在控制台中输入-arg的时候会显示该说明,类似-help

 可注册flag类型有:Bool / Int? /? Int64 /? Uint / Uint64 / Float / Float64 / String / Duration / Var

type?Flag

type Flag struct {
    Name     string // flag在命令行中的名字
    Usage    string // 帮助信息
    Value    Value  // 要设置的值
    DefValue string // 默认值(文本格式),用于使用信息
}

Flag类型代表一条flag的状态

?

type?FlagSet

type FlagSet struct {
    // Usage函数在解析flag出现错误时会被调用
    // 该字段为一个函数(而非采用方法),以便修改为自定义的错误处理函数
    Usage func()
    // 内含隐藏或非导出字段
}

FlagSet代表一个已注册的flag的集合。FlagSet零值没有名字,采用ContinueOnError错误处理策略。

func?Int

func Int(name string,value int,usage string) *int

Int用指定的名称、默认值、提示信息注册一个int类型flag。返回一个保存了该flag的值的指针。

func?IntVar

func IntVar(p *int,name string,usage string)

IntVar用指定的名称、默认值、使用信息注册一个int类型flag,并将flag的值保存到p指向的变量。

func?Parse?

func Parse()

从os.Args[1:]中解析注册的flag。必须在所有flag都注册好而未访问其值时执行。未注册却使用flag -help时,会返回ErrHelp。

即:将输入的flag和注册的flag进行匹配解析

func?Parsed

func Parsed() bool

返回是否Parse已经被调用过。

示例代码:

main.go

package main

import (
	"flag"
	"fmt"
)

func main() {
	married := flag.Bool("married",false,"Are you married?")
	age := flag.Int("age",22,"How old are you?")
	name := flag.String("name"," ","What your name?")

	var address string
	//flag.StringVar这样的函数第一个参数换成了变量地址,后面的参数和flag.String是一样的。
	flag.StringVar(&address,"address","GuangZhou","Where is your address?")

	flag.Parse() //解析输入的参数

	fmt.Println("输出的参数married的值是:",*married) //不加*号的话,输出的是内存地址
	fmt.Println("输出的参数age的值是:",*age)
	fmt.Println("输出的参数name的值是:",*name)
	fmt.Println("输出的参数address的值是:",address)
}

?

执行结果:

?

?

address参数我们并没有指定值,则输出的就是默认值.
另外,-arg后面的=号也不是必须的,可以用空格代替.
如果要查看该程序的所有参数的使用,可以使用-help来查看,如下:

 

?

?

?

func?PrintDefaults?

func PrintDefaults()

PrintDefault会向标准错误输出写入所有注册好的flag的默认值。

func?NFlag

func NFlag() int

NFlag返回已被设置的flag的数量。

func?Lookup

func Lookup(name string) *Flag

返回已经已注册flag的Flag结构体指针;如果flag不存在的话,返回nil。

func?NArg

func NArg() int

NArg返回解析flag之后剩余参数的个数。

func?Args

func Args() []string

返回解析之后剩下的非flag参数。(不包括命令名).就是无法进行flag匹配的有哪些,

func?Arg

func Arg(i int) string

返回解析之后剩下的第i个参数,从0开始索引。

func?Var

func Var(value Value,usage string)

Var方法使用指定的名字、使用信息注册一个flag。该flag的类型和值由第一个参数表示,该参数应实现了Value接口。例如,用户可以创建一个flag,可以用Value接口的Set方法将逗号分隔的字符串转化为字符串切片。

func?Set

func Set(name,value string) error

设置已注册的flag的值,修改或者设置

func?Visit

func Visit(fn func(*Flag))

按照字典顺序遍历标签,并且对每个标签调用fn。?这个函数只遍历解析时进行了设置的标签。[就是执行时提供非默认的值]

func?VisitAll

func VisitAll(fn func(*Flag))

?按照字典顺序遍历标签,并且对每个标签调用fn。?这个函数会遍历所有标签,不管解析时有无进行设置。

package main
 
 
import (
	"flag"
	"fmt"
)
 
 
func main() {
	// golang的flag包的一些基本使用方法
 
 
	// 待使用的变量
	var id int
	var name string
	var male bool
 
 
	// 是否已经解析
	fmt.Println("parsed? = ",flag.Parsed())
 
 
	// 设置flag参数 (变量指针,参数名,默认值,帮助信息)
	// 也可以用以下带返回值的方法代替,不过他们返回的是指针,比较麻烦点
	// Int(name string,usage string) *int
	// String(name string,value string,usage string) *string
	// Bool(name string,value bool,usage string) *bool
	flag.IntVar(&id,"id",123,"help msg for id")
	flag.StringVar(&name,"name","default name","help msg for name")
	flag.BoolVar(&male,"male","help msg for male")
 
 
	// 解析
	flag.Parse()
 
 
	// 是否已经解析
	fmt.Println("parsed? = ",flag.Parsed())
 
 
	//
 
 
	// 获取非flag参数
	fmt.Println(flag.NArg())
	fmt.Println("------ Args start ------")
	fmt.Println(flag.Args())
	for i,v := range flag.Args() {
		fmt.Printf("arg[%d] = (%s).n",i,v)
	}
	fmt.Println("------ Args end ------")
	//
	// visit只包含已经设置了的flag
	fmt.Println("------ visit flag start ------")
	flag.Visit(func(f *flag.Flag) {
		fmt.Println(f.Name,f.Value,f.Usage,f.DefValue)
	})
	fmt.Println("------ visit flag end ------")
	//
	// visitAll只包含所有的flag(包括未设置的)
	fmt.Println("------ visitAll flag start ------")
	flag.VisitAll(func(f *flag.Flag) {
		fmt.Println(f.Name,f.DefValue)
 
 
	})
	fmt.Println("------ visitAll flag end ------")
	//
	// flag参数
	fmt.Printf("id = %dn",id)
	fmt.Printf("name = %sn",name)
	fmt.Printf("male = %tn",male)
 
 
	// flag参数默认值
	fmt.Println("------ PrintDefaults start ------")
	flag.PrintDefaults()
	fmt.Println("------ PrintDefaults end ------")
 
 
	//非flag参数个数
	fmt.Printf("NArg = %dn",flag.NArg())
	// 已设置的flag参数个数
	fmt.Printf("NFlag = %dn",flag.NFlag())
}
 

运行:

go build main.go
main -id 111 -name sary -male "woman" p1 p2 p3

 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读