在 Golang 程序中有很多种方法来处理命令行参数。简单的情况下可以不使用任何库,直接处理 os.Args
;其实 Golang 的标准库提供了 flag
包来处理命令行参数;还有第三方提供的处理命令行参数的库,比如 Pflag 等
package main
import (
"fmt"
"os"
)
func main() {
s := os.Args
fmt.Printf("s: %v\n", s)
}
运行结果
.\main.exe a b c
s: [main.exe a b c]
os.Args返回一个字符串切片,第一个参数是可执行文件,后面是参数
os.Arg只能处理简单的参数,复杂的参数处理,我们可以使用flag包
我们先来看一个实例
package main
import (
"flag"
"fmt"
)
func main() {
age := flag.Int("age", 20, "请输入年龄:")
flag.Parse()
fmt.Printf("age: %T\n", age)
fmt.Printf("age: %v\n", *age)
}
运行结果
go run main.go -age 21
age: *int
age: 21
flag有一系列各种数据类型的方法例如,flag.Int
解析一个int类型的参数,flag.String
解析一个字符串类型的参数。它们有三个参数:
这些方法返回的都是指针类型,正如运行结果你看到的*int
。所以,获得参数结果使用要使用*age
。
flag.Parse()
方法用来解析参数,如果不调用该方法,参数不会被解析,但是可以获得默认值。你可以注释掉来测试一下。
-flag // 一个中划线
--flag // 两个中划线
-flag=x // 等号
-flag x // 空格 只能是非布尔类型
我们可以编译一下程序获得可以执行文件,在可执行文件后面加 -h
或 -help
获得参数帮助。
go build main.go
.\main.exe -help
Usage of main.exe:
-age int
请输入年龄: (default 20)
.\main.exe -h
Usage of main.exe:
-age int
请输入年龄: (default 20)
我们也可以直接将参数绑定到某个定义好的变量,使用的方法是xxxVar,例如IntVar
:
package main
import (
"flag"
"fmt"
)
func main() {
var age int
flag.IntVar(&age, "age", 20, "请输入一个年龄:")
flag.Parse()
fmt.Printf("age: %v\n", age)
}
运行结果:
go run main.go -age 22
age: 22
该方法有四个参数:
如果除了使用flag的方式设置的参数,还有其他命令行参数可以使用flag.Args()
、flag.Arg(i)
和flag.NArg()
这个几个方法来获得。
flag.Args()
:返回所有参数,类型是字符串切片
flag.Arg(i)
:返回单个参数,索引从0开始
flag.NArg()
:返回参数个数
package main
import (
"flag"
"fmt"
)
func main() {
flag.Int("age", 20, "请输入一个年龄:")
flag.String("name", "老郭", "请输入一个姓名")
flag.Parse()
fmt.Printf("flag.Args(): %v\n", flag.Args())
for i := 0; i < flag.NArg(); i++ {
s := flag.Arg(i)
fmt.Printf("s: %v\n", s)
}
}
运行结果
go run main.go -age=20 -name=郭宏志 aaa bbb
flag.Args(): [aaa bbb]
s: aaa
s: bbb