如何使用Go的标志包打印位置参数的用法?

时间:2015-08-07 08:36:13

标签: go

鉴于这个简单的Go程序只需要一个命令行参数,我该如何改进它以便flag.Usage()提供有用的输出?

package main

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

func main() {
    flag.Parse()
    if len(flag.Args()) == 0 { 
        flag.Usage()
        os.Exit(1)
    }

    args := flag.Args()
    fmt.Println(args[0])
}

当前输出没有给出参数:

$ ./args
Usage of ./args:

(即用法是空的,因为我无法告诉usage()函数需要哪些参数)。

我可以删除flag.Usage()并将其替换为以下内容:

fmt.Fprintln(os.Stderr, "Usage:", os.Args[0], "<argument>")

但是,如果flag.Usage()已经有了一个很好的方法,我不想重新发明轮子。特别是因为它已经处理了可选参数:

$ ./args -foo
flag provided but not defined: -foo
Usage of ./args:

1 个答案:

答案 0 :(得分:11)

flag.Usage()只会为您提供有关已定义标志的有用信息。因此,您可以通过var foo = flag.Int(...)将参数定义为标记。

另一种选择是定义自己的使用处理程序。请参阅下面的一个简单示例,该示例将打印自定义消息以及所有已定义标志的默认值。这样,如果Usage失败,则会打印自定义flag.Parse()

package main
import (
    "flag"
    "fmt"
    "os"
)

func myUsage() {
     fmt.Printf("Usage: %s [OPTIONS] argument ...\n", os.Args[0])
     flag.PrintDefaults()
}

func main() {
     flag.Usage = myUsage
     /* ... */
}