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