2015-08-03 114 views

回答

11

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

你可以做的是使用(所有)标志的合理默认值。如果某个标志类似于没有明智的缺省值,请在应用程序的开始处检查该值,然后停止并显示错误消息。无论如何,你应该进行标志值验证(不仅仅针对所需的标志),所以这不应该意味着任何(大的)开销,这是一个很好的习惯。

3

我喜欢github.com/jessevdk/go-flags包在CLI中使用。它提供了required属性,来设置标志强制。这样的:

var opts struct { 
... 
    // Example of a required flag 
    Name string `short:"n" long:"name" description:"A name" required:"true"` 
... 
} 
3

由于already mentioned,将flag包并没有直接提供这个功能,通常你可以(也应该)能够提供一个合理的默认。对于只需要少量显式参数(例如输入和输出文件名)的情况,您可以使用位置参数(例如,flag.Parse()检查flag.NArg()==2然后input, output := flag.Arg(0), flag.Arg(1))。

但是,如果您遇到这种情况不明智的情况,说你想以任何顺序接受几个整数标志,其中任何整数值是合理的,但没有默认值。然后,您可以使用flag.Visit函数来检查您关心的标志是否被明确设置。我认为这是判断一个标志是否明确设置为默认值的唯一方法(不包括Set类型的自定义flag.Value类型)。

例如,可能是这样的:

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” 标志未明确设置这将产生一个错误。

1

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) 
1

如果你有标志路径,只需检查*路径中包含一些值

var path = flag.String("f", "", "/path/to/access.log") 
flag.Parse() 
if *path == "" { 
    usage() 
    os.Exit(1) 
} 
相关问题