Go中的标志包 - 我必须始终设置默认值吗?

Bla*_*ard 13 flags go command-line-arguments

可以不在Go中的flag包中设置默认值吗?例如,在flag包中,您可以写出以下行:

filename := flag.String("file", "test.csv", "Filename to cope with")
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我不一定要设置默认值,test.csv在这种情况下,而是总是让用户指定自己的文件名,如果没有指定,那么我想导致错误并退出程序.

其中一个我想出的办法是,我第一次检查的价值filename做后flag.Parse(),如果该值是test.csv那么我有程序与适当的出错消息退出.但是,如果可以避免,我不想编写这样的冗余代码 - 即使它不能,我也想听听更好的方法来解决这个问题.

argparse顺便说一下,你可以在Python的模块中进行那些操作- 我只想实现类似的东西,如果我能......

另外,我可以在flag包中实现短参数和长参数(换句话说,两者-f-file参数?)?

谢谢.

zzz*_*zzz 16

我认为以这样一种方式设计你的标志值是不恰当的,这种方式在等于各自类型的零值时暗示"不存在".例如:

optFile := flag.String("file", "", "Source file")
flag.Parse()
fn := *optFile
if fn == "" {
        fn = "/dev/stdin"
}
f, err := os.Open(fn)
...
Run Code Online (Sandbox Code Playgroud)

广告第二个问题:IINM,标志包按设计不区分-flag--flag.督察,你可以同时-f--file你的标志设置和写入的任何版本---两者之前ffile.但是,考虑到另一个定义的标志-g,标志包将不会被识别-gf foo为等价的-g -f foo.

  • `flag`包是否提供了检查是否设置了标志的方法?我不是在讨论默认值,也不是没有值.我的意思是,命令行中是否存在标志. (5认同)
  • @Kiril,你可以使用[Visit](https://godoc.org/flag#Visit)函数. (2认同)
  • @Kiril,您可以使用 Bool 选项。如果其值为 true,则设置该标志。[示例](https://gobyexample.com/command-line-flags) (2认同)

def*_*ode 5

当我有一个不能有默认值的标志时,我经常使用值REQUIRED或类似的东西.我觉得这样--help更容易阅读.

至于为什么它没有被烘烤,我怀疑它只是被认为不够重要.默认值不适合所有需要.但是,--help旗帜是相似的; 它并不适合所有需要,但大部分时间它都足够好.

这并不是说所需的标志是个坏主意.如果你足够热情,一个flagutil包裹可能会很好.把当前的flagAPI,使Parse返回描述丢失标志错误并添加RequiredIntRequiredIntVar等.如果事实证明是有用/流行可能与正式合并flag包.