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已经被调用过。

package main

import (
"flag"
"fmt"
) func main() {
married := flag.Bool("married", false, "Are you married?")
age := flag.Int("age", , "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", , "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).\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.Value, f.Usage, f.DefValue) })
fmt.Println("------ visitAll flag end ------")
//
// flag参数
fmt.Printf("id = %d\n", id)
fmt.Printf("name = %s\n", name)
fmt.Printf("male = %t\n", male) // flag参数默认值
fmt.Println("------ PrintDefaults start ------")
flag.PrintDefaults()
fmt.Println("------ PrintDefaults end ------") //非flag参数个数
fmt.Printf("NArg = %d\n", flag.NArg())
// 已设置的flag参数个数
fmt.Printf("NFlag = %d\n", flag.NFlag())
}
# go run demo2_flag.go -id  -name "xx" -male=true p1 p2 p3
parsed? = false
parsed? = true ------ Args start ------
[p1 p2 p3]
arg[] = (p1).
arg[] = (p2).
arg[] = (p3).
------ Args end ------
------ visit flag start ------
id help msg for id
male true help msg for male false
name xx help msg for name default name
------ visit flag end ------
------ visitAll flag start ------
id help msg for id
male true help msg for male false
name xx help msg for name default name
------ visitAll flag end ------
id =
name = xx
male = true
------ PrintDefaults start ------
-id int
help msg for id (default )
-male
help msg for male
-name string
help msg for name (default "default name")
------ PrintDefaults end ------
NArg =
NFlag =

在flag包中,进行了进一步封装:将FlagSet的方法都重新定义了一遍,也就是提供了一序列函数,而函数中只是简单的调用已经实例化好了的FlagSet

Go基础篇【第6篇】: 内置库模块 flag的更多相关文章

  1. Go内置库模块 flag

    import "flag" flag包实现了命令行参数的解析.每个参数认为一条记录,根据实际进行定义,到一个set集合.每条都有各自的状态参数. 在使用flag时正常流程: 1.  ...

  2. Go基础篇【第8篇】: 内置库模块 bytes [二]

    type Reader ¶ type Reader struct { // 内含隐藏或非导出字段 } Reader类型通过从一个[]byte读取数据,实现了io.Reader.io.Seeker.io ...

  3. Go基础篇【第1篇】: 内置库模块 OS

    os包提供了操作系统函数的不依赖平台的接口.设计为Unix风格的,虽然错误处理是go风格的:失败的调用会返回错误值而非错误码.通常错误值里包含更多信息.os包的接口规定为在所有操作系统中都是一致的.非 ...

  4. Go基础篇【第5篇】: 内置库模块 exec

    Package exec runs external commands. It wraps os.StartProcess to make it easier to remap stdin and s ...

  5. Go基础篇【第8篇】: 内置库模块 bytes [一]

    bytes包实现了操作[]byte的常用函数.本包的函数和strings包的函数相当类似. func Compare func Compare(a, b []byte) int Compare函数返回 ...

  6. Go基础篇【第4篇】: 内置库模块 bufio

    bufio包实现了有缓冲的I/O.它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象. 即:为了解决CPU与磁盘IO ...

  7. Go基础篇【第2篇】: 内置库模块 fmt

    fmt官方文档说明:https://studygolang.com/pkgdoc import "fmt" mt包实现了类似C语言printf和scanf的格式化I/O.格式化动作 ...

  8. day05 模块以及内置常用模块用法

    内置常用模块详解: 1 time 2 datetime 3 random   4 os 5 sys 6 shutil 7 shelve 8 xml 9 configparser 10 hashlib ...

  9. 【CobaltStrike】对CobaltStrike内置功能模块的了解

    对CobaltStrike内置功能模块的了解 0x00 右键功能列表 Interact 打开beacon Access dump hashes 获取hash Elevate 提权 Golden Tic ...

随机推荐

  1. IPv6静态路由、动态路由

    实验涉及命令以及知识补充 IPv6 接口必须配置 IPv6 地址和子网掩码 使用 ipv6 address ipv6-address/prefix-length [link-local | eui-6 ...

  2. linux 中$ 意思

    grep -n sh$ text.txt   查找文件内容中以 Sh 结尾. grep -n ^a text.txt    文件文件内容中以 a 开头. grep -n ^$ text.txt     ...

  3. IPC进程间通信---消息队列

    消息队列 消息队列:消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识.与管道不同的是消息队 列存放在内核中,只有在内核重启(即操作系统重启)或者显式地删除一个消息队列时,该消息队 ...

  4. Struts2进阶学习4

    Struts2进阶学习4 自定义拦截器的使用 核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <! ...

  5. Linux环境中配置环境变量无效

    1.在Linux系统中的[ ~/.baserc ]文件与[ /etc/profile ]配置环境变量后(可以使任意环境变量)无效的现象,如下为解决办法: 使用命令: vim ~/.zshrc 在 [# ...

  6. QQ群排名优化到霸屏的策略怎么做?

    谈起QQ群排名霸屏,首先要弄清楚概念,有些刚接触QQ群的朋友可能不太了解,所谓的QQ群排名霸屏,就是指当你的客户群体搜索QQ群某个关键词时,出现在QQ群搜索结果前面的群,全部或者大部分都是我们自己的群 ...

  7. 46.VUE学习之--组件之使用动态组件灵活设置页面布局

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. pig分组统计例子

    1.选取数据样本 在pig安装目录下有一个文件tutorial/data/excite-small.log,其中的数据分为3列,中间用制表符分隔,第一列为用户ID,第二列为Unix时间戳,第三列为查询 ...

  9. python中协程实现的本质以及两个封装协程模块greenle、gevent

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为 ...

  10. [转]Makefile中使用$$的使用

    在makefile中,会经常使用shell命令,也经常见到$var 和 $$var的情况,有什么区别呢,区别大了.不要认为在makefile的规则的命令行中使用$var就是将makefile的变量和s ...