在写命令行程序时,对命令参数进行解析是常见的需求, flag包是Go语言标准库提供用来解析命令行参数的包,使得开发命令行工具更为简单。
命令参数的例子:
例如运行:
nginx -h
输出类似信息:
nginx version: nginx/1.10.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : 显示帮助信息
-v : 显示版本信息
-V : 显示版本信息和配置信息
-t : 检测nginx配置文件
下面介绍如何通过flag包实现命令行参数解析。
flag基本用法
package main import ( "fmt" "flag" ) func main() { // 定义命令参数 // flag.xxx序列函数,xxx指的是数据类型,例如String、Int、Bool // 定义个字符串参数,参数名是name, 参数默认值是tizi, 参数提示信息是:姓名 namePtr := flag.String("name", "tizi", "姓名") // 定义个int参数,参数名:age, 默认值:18,提示信息是:年龄 agePtr := flag.Int("age", 18, "年龄") vipPtr := flag.Bool("vip", true, "是否vip") // 自定义命令行 -h 参数,输出什么内容。 flag.Usage = func() { // -h 参数通常用于输出帮助信息,命令有什么参数,怎么用之类的信息 // 先打印下怎么使用命令 fmt.Println("Usage: flagdemo [-h] [-name string] [-vip] [-age int]") // 调用PrintDefaults打印前面定义的参数列表。 flag.PrintDefaults() } // 解析命令行参数 flag.Parse() // 因为前面flag.xxx函数返回的是指针,所以需要在变量前面加上*号读取参数内容 fmt.Println("name:", *namePtr) fmt.Println("age:", *agePtr) fmt.Println("vpi:", *vipPtr) }
运行程序:
go run flagdemo.go -h
输出:
Usage: flagdemo [-h] [-name string] [-vip] [-age int] -age int 年龄 (default 18) -name string 姓名 (default "tizi") -vip 是否vip (default true)