Go是怎么接受外部的命令行参数的?
在Python中有 sys 模块下的 sys.args 可以获取命令行列表,与之对应的,Go 也有一个 flag 包来获取
使用 flag 包获取参数需要哪几个步骤?
- 导入 flag 包
- 初始化变量用来存储外部的命令
- flag 包的配置工作,比如要接收哪些参数等等
- 在前面的准备工作做完之后,要在最后阶段 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个参数
- 用于存储该命令参数的值的地址
- 获取的外部命令参数的名称
- 在未追加该命令参数的默认值
- 该命令的简短说明,在 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的使用只是做一些简单介绍,具体的大家可以去看一下官方文档做深入了解
网友评论