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


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

    import "flag" 

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

    在使用flag时正常流程: 

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

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

    3. 获取flag.String(), flag.Bool(), 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, value int, 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, name string, 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, value int, 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", false, "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).
    ", 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.Value, f.Usage, f.DefValue)
    
    
    	})
    	fmt.Println("------ visitAll flag end ------")
    	//
    	// flag参数
    	fmt.Printf("id = %d
    ", id)
    	fmt.Printf("name = %s
    ", name)
    	fmt.Printf("male = %t
    ", male)
    
    
    	// flag参数默认值
    	fmt.Println("------ PrintDefaults start ------")
    	flag.PrintDefaults()
    	fmt.Println("------ PrintDefaults end ------")
    
    
    	//非flag参数个数
    	fmt.Printf("NArg = %d
    ", flag.NArg())
    	// 已设置的flag参数个数
    	fmt.Printf("NFlag = %d
    ", flag.NFlag())
    }
    
    

    运行:

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

     

      

     

     

  • 相关阅读:
    PAT之我要通过
    卡拉兹(Callatz)猜想
    数组元素循环右移问题
    Reorder List
    一个fork的面试题
    内存流和null字节
    标准C IO函数和 内核IO函数 效率(时间)比较
    由fdopen和fopen想到的
    VS经常报错的link error 2019
    VS快捷键设置
  • 原文地址:https://www.cnblogs.com/saryli/p/11606679.html
Copyright © 2020-2023  润新知