一架梯子,一头程序猿,仰望星空!

golang flag命令行参数解析


在写命令行程序时,对命令参数进行解析是常见的需求, 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包实现命令行参数解析。

1.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)