深色模式
Go 读取命令行参数
Go中读取命令行参数可以使用两种方式:
os.Argsflag包
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] jackflag 包
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 xboolean类型参数的值可以是:
sh
1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False