我们随便写一个日常使用的psql的命令行用法
-
manu@manu-hacks:~$ pg_ctl -D /home/manu/DB_data/ -l /home/manu/DB_data/postgres_manu.log start
- server starting
go语言提供了flag这个package。来应对这种入参的解析。
flag支持的语言格式如下:
- -flag // bool类型only
- -flag=x
- -flag x //not bool 类型
- -W do not wait until operation completes
下面我给出一个例子,简单的解析这个pg_ctl的命令:
-
manu@manu-hacks:~/code/go/self$ cat pg_ctl_parse.go
-
package main
-
import (
-
"fmt"
-
"flag"
-
)
-
-
func main(){
-
-
data_path := flag.String("D","/home/manu/sample/","DB data path")
-
log_file := flag.String("l","/home/manu/sample.log","log file")
-
nowait_flag :=flag.Bool("W",false,"do not wait until operation completes")
-
-
flag.Parse()
-
-
var cmd string = flag.Arg(0);
-
-
fmt.Printf("action : %s\n",cmd)
-
fmt.Printf("data path: %s\n",*data_path)
-
fmt.Printf("log file : %s\n",*log_file)
-
fmt.Printf("nowait : %v\n",*nowait_flag)
-
-
fmt.Printf("-------------------------------------------------------\n")
-
-
fmt.Printf("there are %d non-flag input param\n",flag.NArg())
-
for i,param := range flag.Args(){
-
fmt.Printf("#%d :%s\n",i,param)
-
}
-
-
- }
第一行对应的是data_path的解析规则
-D选项对应的值是字符串类型字符串,
默认值是“/home/manu/sample”,
DB data path提示信息或者help信息或者说明是。
-
manu@manu-hacks:~/code/go/self$ go run pg_ctl_parse.go -D /home/manu/DB_data/ -l /home/manu/DB_data/postgres_manu.log -W start
action : start
data path: /home/manu/DB_data/
log file : /home/manu/DB_data/postgres_manu.log
nowait : true
-------------------------------------------------------
there are 1 non-flag input param
#0 :start
manu@manu-hacks:~/code/go/self$ go run pg_ctl_parse.go -l=/home/manu/DB_data/postgres_manu.log -W -D /home/manu/DB_data/ start
action : start
data path: /home/manu/DB_data/
log file : /home/manu/DB_data/postgres_manu.log
nowait : true
-------------------------------------------------------
there are 1 non-flag input param
#0 :start
但是晴朗的天空中也有一片乌云,start不是这种 -key=alue 或则-option的类型,flag是解析不了的。我们称这种参数为non-flag参数,flag解析遇到non-flag参数就停止了:
-
s := f.args[0]
-
if len(s) == 0 || s[0] != '-' || len(s) == 1 {
-
return false, nil
- }
-
manu@manu-hacks:~/code/go/self$ go run pg_ctl_parse.go start -l=/home/manu/DB_data/postgres_manu.log -W -D /home/manu/DB_data/
action : start
data path: /home/manu/sample
log file : /home/manu/sample.log
nowait : false
-------------------------------------------------------
there are 5 non-flag input param
#0 :start
#1 :-l=/home/manu/DB_data/postgres_manu.log
#2 :-W
#3 :-D
#4 :/home/manu/DB_data/
-
fmt.Printf("there are %d non-flag input param\n",flag.NArg())
-
for i,param := range flag.Args(){
-
fmt.Printf("#%d :%s\n",i,param)
- }
从例子上看,flag package很有用,但是并没有强大到解析一切的程度。
如果你有类似-option或者-key =value这种参数,不妨试试 flag。如果你的入参解析非常复杂,flag可能捉襟见肘。
参考文献:
1 标准库—命令行参数解析flag
2