go flag

1350368559 · · 1306 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


flag 用法参考:

https://golang.google.cn/pkg/flag/


1. 命令源码文件怎样接收参数

package main

import (
    "flag" #导入flag包
    "fmt"
)

var name string

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

func main(){
    flag.Parse() #函数flag.Parse用于真正解析命令参数,并把它们的值赋给相应的变量。
    fmt.Printf("hello,%s!\n",name)
}

函数flag.StringVar接受 4 个参数。

第 1 个参数是用于存储该命令参数值的地址,具体到这里就是在前面声明的变量name的地址了,由表达式&name表示。

第 2 个参数是为了指定该命令参数的名称,这里是name。

第 3 个参数是为了指定在未追加该命令参数时的默认值,这里是everyone。

第 4 个函数参数,即是该命令参数的简短说明了,这在打印命令说明时会用到。


go run demo2.go -name="huaihe"
Hello, huaihe!


2. 怎样在运行命令源码文件的时候传入参数,又怎样查看参数的使用说明


如果想查看该命令源码文件的参数说明,可以这样做:

go run demo2.go --help
Usage of /var/folders/4w/lv_wjx0d3b3ff30w0bn_65xc0000gn/T/go-build966482306/b001/exe/demo2: #构建上述命令源码文件时临时生成的可执行文件的完整路径
  -name string
        The greeting object. (default "everyone")
exit status 2


果我们先构建这个命令源码文件再运行生成的可执行文件,像这样:

go build demo2.go
ls demo2
demo2
./demo2 --help
Usage of ./demo2:
  -name string
        The greeting object. (default "everyone")


3. 怎样自定义命令源码文件的参数使用说明

这有很多种方式,最简单的一种方式就是对变量flag.Usage重新赋值。flag.Usage的类型是func(),即一种无参数声明且无结果声明的函数类型。flag.Usage变量在声明时就已经被赋值了,所以我们才能够在运行命令go run demo2.go --help时看到正确的结果。注意,对flag.Usage的赋值必须在调用flag.Parse函数之前。

package main

import (
    "flag"
    "fmt"
    "os"
)

var name string

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

func main() {
    flag.Usage = func() {
        fmt.Fprintf(os.Stderr, "Usage of %s:\n", "question")
        flag.PrintDefaults()
    }
    flag.Parse()
    fmt.Printf("hello,%s!\n", name)
}
go run demo2.go --help
#这里并没有打印临时文件位置,而是打印了os.Stderr,此时为空
Usage of question:
  -name string
        The greting object (default "everyone")
exit status 2



再深入一层,我们在调用flag包中的一些函数(比如StringVar、Parse等等)的时候,实际上是在调用flag.CommandLine变量的对应方法。

flag.CommandLine相当于默认情况下的命令参数容器。所以,通过对flag.CommandLine重新赋值,我们可以更深层次地定制当前命令源码文件的参数使用说明。

现在我们把main函数体中的那条对flag.Usage变量的赋值语句注销掉,然后在init函数体的开始处添加如下代码:

package main

import (
    "flag"
    "fmt"
    "os"
)

var name string

func init() {
    flag.CommandLine = flag.NewFlagSet("", flag.ExitOnError)
    flag.CommandLine.Usage = func() {
        fmt.Fprintf(os.Stderr, "Usage of %s:\n", "question")
        flag.PrintDefaults()
    }
    flag.StringVar(&name, "name", "everyone", "The greting object")
}

func main() {
    flag.Parse()
    fmt.Printf("hello,%s!\n", name)
}
go run demo2.go --help
Usage of question:
  -name string
        The greting object (default "everyone")
exit status 2

其输出会与上一次的输出的一致。不过后面这种定制的方法更加灵活。比如,当我们把为flag.CommandLine赋值的那条语句改为

package main

import (
    "flag"
    "fmt"
    "os"
)

var name string

func init() {
    flag.CommandLine = flag.NewFlagSet("", flag.PanicOnError) #注意这里修改为flag.PanicOnError
    flag.CommandLine.Usage = func() {
        fmt.Fprintf(os.Stderr, "Usage of %s:\n", "question")
        flag.PrintDefaults()
    }
    flag.StringVar(&name, "name", "everyone", "The greting object")
}

func main() {
    flag.Parse()
    fmt.Printf("hello,%s!\n", name)
}






有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:1350368559

查看原文:go flag

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1306 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传