有没有办法如何设置某些标志是强制性的,还是我必须检查自己的存在?Go中的命令行标志可以设置为强制吗?
13
A
回答
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
}
}
如果任一 “-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)
}
相关问题
- 1. perl:强制使用命令行标志?
- 2. 设置命令行Java错误日志?
- 3. 您可以为Windows CMD命令设置键盘快捷键吗?
- 4. 可能强制从命令行迁移?
- 5. 我可以强制GAE为CSS文件设置缓存标头吗?
- 6. 使用带Argparse4j的命令行参数设置标志
- 7. Bazel-可以云雀行动读取命令行标志(strict_java_deps)
- 8. 我可以在Eclipse Java项目运行配置中设置任意命令吗?
- 9. 你可以强制鼠标移动吗?
- 10. 可以放置标志MSG_NOSIGNAL吗?
- 11. 我可以强制Maven 2要求在命令行上指定属性吗?
- 12. 你可以在python中标记命令行输入吗?
- 13. 我可以在SQL Server中强制用户进行某些设置吗?
- 14. 您可以强制执行MPMoviePlayerPlaybackDidFinishNotification吗?
- 15. MySQL二进制日志复制:它可以被设置为忽略错误吗?
- 16. 我可以强制UL成为OL吗?
- 17. C#可以强制转换为const吗?
- 18. 你可以在一行中用!bpmd设置一个断点命令吗?
- 19. 可以从命令行驱动VisualSVN吗?
- 20. 可以用SAS执行Linux命令吗?
- 21. Can Instruments可以使用命令行吗?
- 22. 我可以在PendingIntent.getService中将标志设置为0
- 23. Go中的“3态”命令行参数
- 24. 我可以在Bash的命令行上设置一个环境变量吗?
- 25. MSTest的命令行设置
- 26. JMeter命令行:我可以将运行日志输出到STDOUT吗?
- 27. 我可以配置git运行一个命令(在推)吗?
- 28. 使用imagemagick在命令行中添加可见标志pdf
- 29. 我可以强制生成JVM崩溃日志文件吗?
- 30. 设置视觉工作室编译标志来通”命令行运行溶液