深色模式
Go 读取命令行参数
Go中读取命令行参数可以使用两种方式:
os.Args
flag
包
os.Args
os.Args
的类型是 []string
,其中,os.Args[0]
是当前可执行文件的绝对路径,os.Args[1]
开始后面的字符串是执行命令中的所有参数。
编写代码:
go
// main.go
func main() {
args := os.Args
fmt.Printf("args -- %v\n", args)
fmt.Printf("args[0] -- %v\n", args[0])
fmt.Printf("args[1] -- %v\n", args[1])
fmt.Printf("args[2] -- %v\n", args[2])
}
执行命令:
sh
go run main.go --name jack abc
输出:
args [/var/folders/jm/_ytkbq052_s8rvj8pqgfz7jr0000gn/T/go-build1948527265/b001/exe/main --name jack abc]
args[0] /var/folders/jm/_ytkbq052_s8rvj8pqgfz7jr0000gn/T/go-build1948527265/b001/exe/main
args[1] --name
args[2] jack
flag 包
flag.Parse()
flag.Parse()
用于执行解析的动作。
标识参数,需要先定义好,才可以调用这个函数:
go
func testFlag() {
n := flag.Int("n", 12, "参数n")
count := flag.Int("count", 13, "this is count")
flag.Parse()
fmt.Printf("读取到 n: %d\n", *n)
fmt.Printf("读取到 count: %d\n", *count)
}
而非标识参数,先调用flag.Parse()
再读取参数即可:
go
func testArg() {
flag.Parse()
arg0 := flag.Arg(0)
arg1 := flag.Arg(1)
arg10 := flag.Arg(10)
fmt.Printf("arg0: %s, arg1: %s, arg10: %s\n", arg0, arg1, arg10)
}
解析标识参数(flag argument)
将参数定义为不同类型的值:
go
flag.String()
flag.Int()
flag.Bool()
定义为指针:
go
var nFlag = flag.Int("n", 1234, "help message for flag n")
定义为变量:
go
var fileName string
flag.StringVar(&fileName, "fileName", "doc.txt", "help info for flag fileName.")
解析非标识参数(non-flag argument)
读取所有非标识参数:
go
args := flag.Args()
根据下标读取参数:
go
arg := flag.Arg(0)
注意:不同于os.Args
,以上2个方法,都读取不到执行文件的路径。
命令行传递参数
标识参数在前,非标识参数在后
不然会出问题,因为,程序在解析到第一个非标识参数时,会停止解析标识参数,而把从这个参数开始后面的参数都解析为非标识参数。
正确:
sh
somecmd -a 10 -b 20 c
解析得到 a=10
、b=20
、"c"
错误:
sh
somecmd -a 10 c -b 20
解析得到 a=10
、"c"
、"-b"
、"c"
标识参数的格式
标识前面有1个或2个减号都可以:
-
、--
。标识后面可以不带值;
标识用等号
=
连接值;标识用空格连接值,此格式只适用于非boolean类型参数。
sh
-flag
-flag=x
-flag x // non-boolean flags only
--flag x
boolean类型参数的值可以是:
sh
1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False