Go-知识-flag
定义flag有两种方式:flag.StringVar(&Conf,"conf","./conf/captain.conf","配置文件")自定义flag,需要实现flag.Value接口比如bool需要注意必须是指针,因为值类型没法修改外部变量的值。直接调用CommandLine的Var方法,不管是flag.Xxx还是flag.XxxVar还是自定义的flag.Var都是调用了CommandLine的Var方法//参数的名字不能以-开始或者包含=_go flag
文章信息
- 原文链接:https://jiayq.blog.csdn.net/article/details/145080166
- 发布时间:2025-01-11 17:38:04
- 阅读量:1
- 标签:#golang, #go, #命令行, #flag, #参数解析
摘要
文章浏览阅读1.2k次,点赞9次,收藏16次。定义flag有两种方式:flag.StringVar(&Conf,”conf”,”./conf/captain.conf”,”配置文件”)自定义flag,需要实现flag.Value接口比如bool需要注意必须是指针,因为值类型没法修改外部变量的值。直接调用CommandLine的Var方法,不管是flag.Xxx还是flag.XxxVar还是自定义的flag.Var都是调用了CommandLine的Var方法//参数的名字不能以-开始或者包含=_go flag
Go-知识-flag
- 1. 命令行
- 2. 参数解析
- 2.1 flag 参数定义绑定
- 2.2 flag参数解析
- 2.1 flag 参数定义绑定
- 3. flag的方法
- 4. flag 支持的类型
- 5. 第三方库
- 6. 一个小例子
1. 命令行
写命令行程序时需要对命令参数进行解析,这时可以使用标准库的 os 包。 os 包可以通过变量 Args 来获取命令参数, os.Args 返回一个字符串数组,其中第一个参数就是执行文件本身。
假设有如下源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Args)
for k, v := range os.Args {
fmt.Println(k, v)
}
}
然后使用命令进行打包go build -o ./test ./gostudy/main/main.go
打包后如下
使用 chmod +x test进行授权,并执行
2. 参数解析
Flag 包是Go语言标准库提供的用来解析命令行参数的包,使得开发命令行工具更为简单。
flag 包支持的标志格式有:
- -flag : 代表 bool 值,相当于 -flag=true
- -flag=x : 支持任意值
- -flag x: 不支持 bool 值标志
一个简单的小例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package main
import (
"flag"
"fmt"
)
var (
h, H bool
v bool
q *bool
D string
Conf string
)
func init() {
flag.BoolVar(&h, "h", false, "帮助信息")
flag.BoolVar(&H, "H", false, "帮助信息")
flag.BoolVar(&v, "v", false, "显示版本信息")
flag.StringVar(&D, "D", "deamon", "设置为deamon模式")
flag.StringVar(&Conf, "conf", "./conf/captain.conf", "配置文件")
q = flag.Bool("q", false, "quiet")
flag.Usage = func() {
fmt.Println("Usage: captain [options]")
flag.PrintDefaults()
}
flag.Parse()
cmd := flag.Arg(0)
fmt.Println(cmd)
fmt.Println(flag.Args())
fmt.Printf("q: %v\n", *q)
fmt.Printf("h: %v\n", h)
fmt.Printf("deamon: %s", D)
fmt.Printf("conf: %s", Conf)
fmt.Println(flag.NArg())
}
func main() {
//fmt.Println(os.Args)
//for k, v := range os.Args {
// fmt.Println(k, v)
//}
flag.Parse()
if h || H {
flag.Usage()
return
}
}
还是进行编译后执行
2.1 flag 参数定义绑定
定义flag 有两种方式:
- Flag.Xxx() : 其中 Xxx 可以是 Int, String 等,返回一个相应类型的指针:
q = flag.Bool("q", false, "quiet")
- Flag.XxxVar(): 将flag绑定到一个变量上:
flag.StringVar(&Conf, "conf", "./conf/captain.conf", "配置文件")
- 自定义flag,需要实现 flag.Value 接口
比如 bool
需要注意必须是指针,因为值类型没法修改外部变量的值。
参数定义的源码:
1
2
3
4
5
6
// BoolVar defines a bool flag with specified name, default value, and usage string.
// The argument p points to a bool variable in which to store the value of the flag.
func BoolVar(p *bool, name string, value bool, usage string) {
CommandLine.Var(newBoolValue(value, p), name, usage)







