猿问

Go 中的命令行标志可以设置为强制吗?

有没有办法设置某些标志是强制性的,还是我必须自己检查它们的存在?


慕虎7371278
浏览 173回答 3
3回答

达令说

该flag包不支持强制或必需标志(意味着必须明确指定标志)。您可以做的是为(所有)标志使用合理的默认值。如果某个标志类似于没有合理的默认值,请检查应用程序开始时的值,并以错误消息停止。无论如何,您应该进行标志值验证(不仅仅是针对必需的标志),因此这不应意味着任何(大)开销,这通常是一个很好的做法。

繁星coding

正如已经提到的,该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”标志,这将产生错误。

三国纷争

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)
随时随地看视频慕课网APP

相关分类

Go
我要回答