转自一篇文章,清晰易懂
https://www.cnblogs.com/sparkdev/p/10812422.html
入门 demo
在 Go workspace 的 src 目录下创建 flagdemo 目录,并在目录下创建 main.go 文件,编辑其内容如下:
package main
import "flag"
import "fmt"
// 定义命令行参数对应的变量,这三个变量都是指针类型
var cliName = flag.String("name", "nick", "Input Your Name")
var cliAge = flag.Int("age", 28, "Input Your Age")
var cliGender = flag.String("gender", "male", "Input Your Gender")
// 定义一个值类型的命令行参数变量,在 Init() 函数中对其初始化
// 因此,命令行参数对应变量的定义和初始化是可以分开的
var cliFlag int
func Init() {
flag.IntVar(&cliFlag, "flagname", 1234, "Just for demo")
}
func main() {
// 初始化变量 cliFlag
Init()
// 把用户传递的命令行参数解析为对应变量的值
flag.Parse()
// flag.Args() 函数返回没有被解析的命令行参数
// func NArg() 函数返回没有被解析的命令行参数的个数
fmt.Printf("args=%s, num=%d\n", flag.Args(), flag.NArg())
for i := 0; i != flag.NArg(); i++ {
fmt.Printf("arg[%d]=%s\n", i, flag.Arg(i))
}
// 输出命令行参数
fmt.Println("name=", *cliName)
fmt.Println("age=", *cliAge)
fmt.Println("gender=", *cliGender)
fmt.Println("flagname=", cliFlag)
}
使用 flag 包前要通过 import 命令导入该包:
import "flag"
定义一个整型的参数 age,返回指针类型的变量:
var cliAge = flag.Int("age", 28, "Input Your Age")
创建值类型的参数变量,并在 Init() 函数中对其初始化(注意这里调用的是 flag.IntVar 方法):
var cliFlag int func Init() { flag.IntVar(&cliFlag, "flagname", 1234, "Just for demo") }
通过 flag.Parse() 函数接下命令行参数,解析函数将会在碰到第一个非 flag 命令行参数时停止:
flag.Parse()
命令行传参的格式:
-isbool (一个 - 符号,布尔类型该写法等同于 -isbool=true) -age=x (一个 - 符号,使用等号) -age x (一个 - 符号,使用空格) --age=x (两个 - 符号,使用等号) --age x (两个 - 符号,使用空格)
运行 demo
在 flagdemo 目录下执行 go build 命令编译 demo 生成可执行文件 flagdemo。
不传递命令行参数
此时输出的命令行参数都是定义的默认值。
传递命令行参数
传递的命令行参数会覆盖默认值。
传递多余的命令行参数
可以通过 flag.Args() 和 flag.NArg() 函数获取未能解析的命令行参数。
传递错误的命令行参
如果通过 -xx 传入未定义的命令行参数,则会直接报错退出,并输出帮助信息。
查看帮助信息
通过命令行参数 -h 或 --help 可以查看帮助信息: