go flag包使用

2020-01-08  本文已影响0人  leejnull

Go是怎么接受外部的命令行参数的?

在Python中有 sys 模块下的 sys.args 可以获取命令行列表,与之对应的,Go 也有一个 flag 包来获取

使用 flag 包获取参数需要哪几个步骤?

  1. 导入 flag 包
  2. 初始化变量用来存储外部的命令
  3. flag 包的配置工作,比如要接收哪些参数等等
  4. 在前面的准备工作做完之后,要在最后阶段 flag.Parse()
import (
    "flag"
)

var name string

func init() {
    flag.StringVar(&name, "name", "everyone", "The greeting object.")
}

func main() {
    // Parse 函数必须放在变量声明和 flag 设置之后调用
    flag.Parse()
    fmt.Printf("Hello, %s!\n", name)
}

flal.StringVar 接收4个参数

  1. 用于存储该命令参数的值的地址
  2. 获取的外部命令参数的名称
  3. 在未追加该命令参数的默认值
  4. 该命令的简短说明,在 go run xx.go --help 时会输出

name 的赋值方式,除了上面的 StringVar 之外,还有一个 String 函数也可以

// 通过返回值的方式
var name = flag.String("name", "everyone", "The greeting object.")

设置完,这样调用就完成了一个最简单的读取命令行参数的功能

go run test.go -name=Lee
// >> Hello, Lee!

// 没有指定 name 参数,会输出默认值 everyone
go run test.go
// >> Hellp, everyone!

// 指定了没有配置的参数,会报错,这个报错的形式如果没有指明的话,就会采取默认的说明
go run test.go -a=1
>>  flag provided but not defined: -a
    Usage of question:
      -name string
            The greeting object. (default "everyone")
    exit status 2

// 这里就用到了 StringVar / String 的第三和第四个参数了
如果我们想自定义说明呢?

很简单,只要实现 flag.Usage 函数就行了

flag.Usage = func() {
    fmt.Fprintf(os.Stderr, "usage of %s:\n这是我自定义的输出信息\n", "question")
    flag.PrintDefaults()
}

这时候调用

>> go run test.go --help

输出信息

Usage of question:
这是我自定义的信息
  -name string
        The greeting object. (default "everyone")
exit status 2

变量名、描述、默认值是固定不变的,但是上面的信息可以自定义

上面在调用 StringVar、Parse 等等的函数的时候。实际上是在调用 flag.CommandLine 变量的对应方法

// flag.ExitOnError 表示是以什么样的形式推出程序,还有 flag.PanicOnError
flag.CommandLine = flag.NewFlagSet("", flag.ExitOnError)
flag.CommandLine.Usage = func() {
    fmt.Fprintf(os.Stderr, "Ueage of %s\n", "question")
    flag.PrintDefaults()
}

// 创建自己私有的命令参数容器
var cmdLine = flag.NewFlagSet("question", flag.ExitOnError)

// 用自己自定义的命令参数
cmdLine.StringVar(&name, "name", "everyone", "The greeting object.")

cmdLine.Parse(os.Args[1:]) // [1:]第一个元素是文件本身,所以要从1开始

以上关于flag的使用只是做一些简单介绍,具体的大家可以去看一下官方文档做深入了解

来自 https://leejnull.github.io/2019/08/21/2019-08-21/

上一篇 下一篇

猜你喜欢

热点阅读