go语言学习-flag包的使用

一、命令行语法

命令行语法主要有以下几种形式:

cmd -flag     //只支持bool类型
cmd -flag=x
cmd -flag x   //只支持非bool类型

以上语法对于一个或两个‘-’号是一样的

对于整形flag,合法的值可以为1234,0664,0x1234或负数等。对于布尔型flag,可以为1,0,t,f,T,F,true,false,TRUE,FALSE,True,False等

二、命令行参数方法

(1)定义flag参数

参数有三个:第一个为参数名称,第二个为默认值,第三个是说明

(1) 通过flag.String(),Bool(),Int() 等flag.Xxx()方法,该种方式返回一个相应的指针
var ip = flag.Int("flagname", 1234, "help message for flagname")
(2) 通过flag.XxxVar()方法将flag绑定到一个变量,该种方式返回值类型,如
var flagvar int
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
(3) 通过flag.Var()绑定自定义类型,自定义类型需要实现Value接口(Receives必须为指针),如
flag.Var(&flagVal, "name", "help message for flagname")

(2)调用flag.Parse()解析命令行参数到定义的flag

flag.Parse()

解析函数将会在碰到第一个非flag命令行参数时停止,非flag命令行参数是指不满足命令行语法的参数,如命令行参数为cmd –flag=true abc则第一个非flag命令行参数为“abc”

(3)调用Parse解析后,就可以直接使用flag本身(指针类型)或者绑定的变量了(值类型)

fmt.Println("flagvar has value ", flagvar)

还可通过flag.Args(), flag.Arg(i)来获取非flag命令行参数

下面是具体的实例:

package main

import (
    "flag"
    "fmt"
)

func main() {

    a := flag.Int("a",1000,"a 的值")
    fmt.Println("a :",a) //a是一个指针类型的变量
    fmt.Println("*a ;",*a)//*a 的值是1000

    var b int
    //通过flag.XxxVar()方法将flag绑定到一个变量,该种方式返回值类型
    //此处我们给int类型额变量b 通过方法flag.IntVar()给b 绑定一个变量
    flag.IntVar(&b,"b",2000,"b 的值")
    fmt.Println("b : ",b)


    name := flag.String("name","lili","Input your username")

    //调用flag.Parse()方法,解析命令行
    flag.Parse()

    //如果命令行有值则覆盖,没有则使用默认值
    fmt.Println("my name is ",*name)
}

什么命令参数也不跟

./studyFlag 

输出结果如下:

a : 0x1830e0f0
*a1000
b :  2000
my name is  lili //此处name的值是默认值

启动时命令行,下面四种效果相同

./studyFlag -name chun
./studyFlag -name=chun
./studyFlag --name chun
./studyFlag --name=chun

执行结果如下:

a : 0x1830c0f0
*a1000
b :  2000
my name is  chun //可以看到此处name的值变成了我们输入的参数

注意的地方是,在同一个程序中flag.xxx()的第一个参数name和flag.xxx.Var()和第二个参数name,他们各自都不能出现相同name的参数,一个name只能出现一次,如果出现多次编译器会报错

猜你喜欢

转载自blog.csdn.net/len_yue_mo_fu/article/details/81041793