是否可以不在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
参数?)?
感谢。
答案 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
,并在-
和--
之前编写任何版本的f
或file
。但是,考虑到另一个已定义的标记-g
,标记包将不将-gf foo
识别为等同于-g -f foo
。
答案 1 :(得分:5)
当我有一个不能有默认值的标志时,我经常使用值REQUIRED
或类似的东西。我发现这使得--help
更容易阅读。
至于为什么它没有被烘烤,我怀疑它被认为不够重要。默认值不适合所有需要。但是,--help
标志是相似的;它并不适合所有需要,但大部分时间它都足够好。
这并不是说所需的标志是个坏主意。如果你足够热情,flagutil
包可能会很好。包裹当前的flag
api,让Parse
返回描述丢失标记的错误,然后添加RequiredInt
和RequiredIntVar
等。如果结果是有用/受欢迎的话可以与官方flag
包合并。