一尘不染

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

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:

(即用法是空的,因为我找不到办法告诉use()函数需要哪些参数)。

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

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

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

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

阅读 321

收藏
2020-07-02

共1个答案

一尘不染

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
     /* ... */
}
2020-07-02