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. 实现虚拟(Virtual)DOM

    Virtual DOM算法 把一个div元素的属性打印出来,如下: 可以看到仅仅是第一层,真正DOM的元素是非常庞大的,这也是DOM加载慢的原因. 相对于DOM对象,原生的JavaScript对象处理 ...

  2. Lucene的原理和应用

    随着互联网的迅速普及与发展,网络舆论对社会生活的影响力越来越大, 网络口碑研究也逐渐形成一个新兴行业.有效的网络口碑研究,需要全方位地倾听网民的声音. 信息检索技术的应用,有效地提高了网络口碑研究的工 ...

  3. CommonJs模块规范

    1.什么是模块化 文件作用域 通信规则 加载 require 导出 exports 2.CommonJs模块规范 在Node中的Javascript还有一个很重要的概念:模块概念 模块作用域 使用re ...

  4. oracle 12c rac vip和监听故障

    环境:aix 7.1 ,oracle 12.1.0.2 rac -3节点. 硬件故障后,硬件工程师更换了内联网卡,不知为何资源VIP也有问题,只好先添加了VIP srvctl add vip -nod ...

  5. bootstrap实现分页

    bootstrap分页功能 写前端都会面临的一个问题就是分页,如果是纯js分页也是可以的,只是可能代码量比较大,所以今天写一个关于用bootstrap框架分页的例子,希望以后可以帮助到一些对这方面比较 ...

  6. php GD 圆图 -处理成圆图片

    <?php /** * 处理成圆图片,如果图片不是正方形就取最小边的圆半径,从左边开始剪切成圆形 * @param string $imgpath [description] * @return ...

  7. 微信小程序中无刷新修改

    1.点击事件无刷新修改 原理:onload事件中是把这个分类和品牌的列表全部拿出来,拼接成数组的格式,在小程序中遍历的时候就要把小标(index)给绑定到左侧的品牌上,然后js中获取index的值,就 ...

  8. hadoop生态搭建(3节点)-01.基础配置

    # 基础配置# ==================================================================node1 vi /etc/hostname nod ...

  9. CopyArrays

    import java.util.Arrays; public class CopyArrays { public static void main(String args[]) { int []a ...

  10. 嵌入式框架Zorb Framework搭建五:事件的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...