如何在Golang中使用flag包指定位置参数?

Kev*_*rke 21 go

有时候我想在命令行上传递一个没有名字的参数,比如一个命令wc,它将文件名作为输入:

wc filename.txt
Run Code Online (Sandbox Code Playgroud)

使用flag包,看起来每个标志都必须被赋予一个名称,如果未指定则具有默认值.

filename := flag.String("filename", "foo.txt", "Which file to count the words for")
Run Code Online (Sandbox Code Playgroud)

但是我不想要一个默认值,如果没有指定参数,我希望程序以错误代码退出.如何向Go二进制文件添加必需参数?

我还希望能够使用类型信息解析参数,因此直接检查Args()并不能完全解决.

One*_*One 14

你只需要检查flag.NArg().

来自https://golang.org/pkg/flag/#NArg:

NArg是处理标志后剩余的参数数.

flag.Parse()
if flag.NArg() == 0 { 
    flag.Usage()
    os.Exit(1)
}
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到`flag.Usage()`函数如何通过位置参数提供有用的输出,因为我找不到"注册"它们的方法.我在这里进一步扩展了这个:http://stackoverflow.com/questions/31873183/how-to-print-usage-for-positional-argument-with-gos-flag-package (5认同)
  • 这是否意味着您不能在位置参数上强制执行类型? (2认同)
  • 请注意:这对位置参数与标志的顺序很敏感。例如: outp := flag.String("output", "out.txt", "输出文件") Shell: myProgrampositional_arg.txt -output redirect.txt # *outp = "out.txt", flag.NArg() = 3 (2认同)