鉴于这个简单的 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 是空的,因为我找不到告诉 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:
最佳答案
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
/* ... */
}
关于go - 如何使用 Go 的标志包打印位置参数的用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31873183/