为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕虎7371278 2021-10-25 20:05:18
有没有办法设置某些标志是强制性的,还是我必须自己检查它们的存在?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

flag包不支持强制或必需标志(意味着必须明确指定标志)。

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


查看完整回答
反对 回复 2021-10-25
?
繁星coding

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”标志,这将产生错误。


查看完整回答
反对 回复 2021-10-25
?
三国纷争

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)


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信