3 回答
TA贡献1821条经验 获得超6个赞
该flag
包不支持强制或必需标志(意味着必须明确指定标志)。
您可以做的是为(所有)标志使用合理的默认值。如果某个标志类似于没有合理的默认值,请检查应用程序开始时的值,并以错误消息停止。无论如何,您应该进行标志值验证(不仅仅是针对必需的标志),因此这不应意味着任何(大)开销,这通常是一个很好的做法。
TA贡献1797条经验 获得超4个赞
正如已经提到的,该flag包不直接提供这个功能,通常你可以(也应该)能够提供一个合理的默认。对于您只需要少量显式参数(例如输入和输出文件名)的情况,您可以使用位置参数(例如在flag.Parse()检查flag.NArg()==2之后然后input, output := flag.Arg(0), flag.Arg(1))。
但是,如果您遇到这种情况不合理的情况;说几个你想以任何顺序接受的整数标志,其中任何整数值都是合理的,但没有默认值。然后您可以使用该flag.Visit函数来检查您关心的标志是否已显式设置。我认为这是判断标志是否明确设置为其默认值的唯一方法(不包括具有保持状态flag.Value的Set实现的自定义类型)。
例如,也许是这样的:
required := []string{"b", "s"}
flag.Parse()
seen := make(map[string]bool)
flag.Visit(func(f *flag.Flag) { seen[f.Name] = true })
for _, req := range required {
if !seen[req] {
// or possibly use `log.Fatalf` instead of:
fmt.Fprintf(os.Stderr, "missing required -%s argument/flag\n", req)
os.Exit(2) // the same exit code flag.Parse uses
}
}
Playground
如果未明确设置“-b”或“-s”标志,这将产生错误。
TA贡献1804条经验 获得超7个赞
go-flags 允许您声明必需的标志和必需的位置参数:
var opts struct {
Flag string `short:"f" required:"true" name:"a flag"`
Args struct {
First string `positional-arg-name:"first arg"`
Sencond string `positional-arg-name:"second arg"`
} `positional-args:"true" required:"2"`
}
args, err := flags.Parse(&opts)
- 3 回答
- 0 关注
- 172 浏览
添加回答
举报