Go-flag

标准库flag实现了命令行参数的解析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func main() {
//ip类型是指针,存放的是指向flagname的指针
var ip = flag.Int("flagname", 1234, "help message")
var flagvar string
//将命令行参数值写入到flagvar中,与StringVar对应的还有IntVar,UintVar等
//func StringVar(p *string, name string, value string, usage string)
flag.StringVar(&flagvar, "flagvar", "helloflag", "help message")

//将命令行解析为定义的标志
flag.Parse()

fmt.Printf("the point address of ip is %x:\n", ip)
fmt.Printf("the value of flagname is %d\n", *ip)
fmt.Printf("the value of flagvar is %s\n",flagvar)
}

命令行传参形式:
-flag
-flag=x
-flag x //只支持非布尔类型

其中---功能是一样的。

子命令的使用

1
2
3
4
5
6
7
8
9
10
11
12
func main() {
flag.Parse()
// 创建一个带有指定名称和错误处理属性的空命令集
goCmd := flag.NewFlagSet("create", flag.ExitOnError)

goCmd.StringVar(&name, "name", "go", "help")
args := flag.Args()
// 对命令进行解析,否则获取不到name中的值
goCmd.Parse(args[1:])
fmt.Println(name)

}

type Value

1
2
3
4
5
6
7
// 值是存储在标志中的动态值的接口。
// 对于每个存在的标志,按命令行顺序调用一次Set。
// 可以通过这个接口的方法实现个性化操作
type Value interface {
String() string
Set(string) error
}

如下代码会对传入的参数值末尾加上_value

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
package main

import (
"flag"
"fmt"
)

type Name string

func (n *Name) String() string {
return fmt.Sprint(*n)
}
func (n *Name) Set(value string) error {
*n = Name(value + "_value")
return nil
}

func main() {
var name Name
flag.Var(&name, "name", "help message")
flag.Parse()
fmt.Printf("name is %s",name)
}
// go run flag2.go -name hys
// output: name is hys_value


REF:
1.https://golang.org/pkg/flag/