os库
1 2 3 4 5 6 7 8 9 10 11 12
| 1package main
2
3import (
4 "fmt"
5 "os"
6)
7
8func main() {
9 fmt.Println("os.Args")
10}
11
12 |
os可以通过变量Args来获取命令参数,os.Args返回一个字符串数组。其中第一个参数就是执行文件的名字。
flag包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 1package main
2
3import (
4 "flag"
5 "fmt"
6)
7
8func main() {
9 name := flag.String("name", "golang", "the name")
10 var year int
11 flag.IntVar(&year, "year", 2009, "the year")
12
13 flag.Parse()
14
15 fmt.Println("name:", *name)
16 fmt.Println("year:", year)
17}
18
19 |
执行go run test.go,会得到
1 2 3 4
| 1name: golang
2year: 2009
3
4 |
当执行go run test.go -name=“benben” -year=2015。将会输出
1 2 3 4
| 1name: benben
2year: 2015
3
4 |
常用函数解析
1、flag.String(name string, value string, usage string)
这个方法用来定义命令行获取的参数名称,默认值。方法会返回一个字符串变量的地址。这个地址中存储了flag参数的值。
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
| 1func String(name string, value string, usage string) *string {
2 return CommandLine.String(name, value, usage)
3}
4
5func (f *FlagSet) String(name string, value string, usage string) *string {
6 p := new(string)
7 f.StringVar(p, name, value, usage)
8 return p
9}
10
11func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
12 f.Var(newStringValue(value, p), name, usage)
13}
14
15func (f *FlagSet) Var(value Value, name string, usage string) {
16 // Remember the default value as a string; it won't change.
17 flag := &Flag{name, usage, value, value.String()}
18 _, alreadythere := f.formal[name]
19 if alreadythere {
20 var msg string
21 if f.name == "" {
22 msg = fmt.Sprintf("flag redefined: %s", name)
23 } else {
24 msg = fmt.Sprintf("%s flag redefined: %s", f.name, name)
25 }
26 fmt.Fprintln(f.Output(), msg)
27 panic(msg) // Happens only if flags are declared with identical names
28 }
29 if f.formal == nil {
30 f.formal = make(map[string]*Flag)
31 }
32 f.formal[name] = flag
33}
34
35 |
2、flag.StringVar(p *string, name string, value string, usage string)
这个方法和String类似,也用来定义命令行获取的参数名称以及默认值。只不过这个方法中没有创建新的字符串指针来存储获取的字符串变量,而是用传进来的参数。
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
| 1func StringVar(p *string, name string, value string, usage string) {
2 CommandLine.Var(new StringValue(value, p), name, usage)
3}
4
5func (f *FlagSet) Var(value Value, name string, usage string) {
6 // Remember the default value as a string; it won't change.
7 flag := &Flag{name, usage, value, value.String()}
8 _, alreadythere := f.formal[name]
9 if alreadythere {
10 var msg string
11 if f.name == "" {
12 msg = fmt.Sprintf("flag redefined: %s", name)
13 } else {
14 msg = fmt.Sprintf("%s flag redefined: %s", f.name, name)
15 }
16 fmt.Fprintln(f.Output(), msg)
17 panic(msg) // Happens only if flags are declared with identical names
18 }
19 if f.formal == nil {
20 f.formal = make(map[string]*Flag)
21 }
22 f.formal[name] = flag
23}
24
25 |
3、flag.Parse()
这个方法会解析命令行参数,从os.Args[1:]开始。这个函数必须在所有的flag都定义好之后,程序获取flag之前调用。
1 2 3 4 5
| 1func Parse() {
2 CommandLine.Parse(os.Args[1:])
3}
4
5 |