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

时间:2013-08-25 13:47:08

标签: go command-line-arguments flags

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

filename := flag.String("file", "test.csv", "Filename to cope with")

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

我提出的方法之一就是我在执行filename之后首先检查flag.Parse()的值,如果该值为test.csv,那么我会让程序退出适当的错误信息。但是,如果可以避免这样做,我不想编写这样的冗余代码 - 即使它不能,我也希望听到更好的方法来解决这个问题。

顺便说一句,您可以在Python的argparse模块中执行这些操作 - 如果可以的话,我只想实现类似的操作...

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

感谢。

2 个答案:

答案 0 :(得分:16)

我认为以这样一种方式设计你的标志值是习惯的,这种方式在等于各自类型的零值时暗示“不存在”。例如:

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

广告第二个问题:IINM,标志包按设计不区分-flag--flag。 IOW,您可以在标记集中同时拥有-f--file,并在---之前编写任何版本的ffile 。但是,考虑到另一个已定义的标记-g,标记包将-gf foo识别为等同于-g -f foo

答案 1 :(得分:5)

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

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

这并不是说所需的标志是个坏主意。如果你足够热情,flagutil包可能会很好。包裹当前的flag api,让Parse返回描述丢失标记的错误,然后添加RequiredIntRequiredIntVar等。如果结果是有用/受欢迎的话可以与官方flag包合并。