文章

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

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参数解析
  • 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)
本文由作者按照 CC BY 4.0 进行授权