命令行参数,常见陷阱,以及Go编程的最佳实践
Can miles truly separate you from friends… If you want to be with someone you love, aren’t you already there?
— Richard Bach
1.1 什么是 flag 库
flag 库的用途
我们都知道,在编程世界中,启动二进制可执行文件一般需要一些命令行参数,这些参数用来控制程序的内部运行,使程序有更好的灵活性。但是用户如果自己在程序中处理这些命令行参数会很繁琐,所以一般的编程语言都会提供一些标准库给用户使用。
而 Go 语言也不例外,flag 库就是 Go 语言用于处理命令行参数的一个标准库,开箱即用,常规的命令行程序的flag形式它都支持,使用起来也十分简单。
1.2 如何使用 flag 库
在 Go 中使用 flag 库
我们可以编写一个示例程序,该程序接受长和宽两个命令行参数,来计算一个矩形的面积。代码如下:
1 | package main |
注意调用 flag.Parse()
来解析命令行参数.
1.3 flag 库的陷阱
在使用 flag 库时可能遇到的一些问题和陷阱,该如何避免。
陷阱一: 非flag参数的影响
当我们把flag放置在cli应用的最后面时,需要小心参数传递的顺序,flag包的命令行参数的解析逻辑是: 当碰到第一个非flag参数时,便停止解析,所以如果传入非法参数就会导致后面的参数解析错误。例如:
1 | ./myprogram show -n=2222 |
如果”show”并不是myprogram
的flag参数,执行后你就会发现,-n
的参数值并未按照我们的预期变为2222,而是保持了默认值。因为在解析完”show”后,flag库就不再继续解析后面的命令行参数了。
陷阱二: bool类型的特性
对于bool类型的flag参数,它不支持”-arg value”的形式,只支持”-arg”或”-arg=value”两种形式。
其他形式都会导致解析失败, 例如:
1 | ./myprogram -b1 true -b2 true -n 2222 |
这里的 b1 和 b2 会解析失败。
1.4 flag 库的最佳实践
展示在实际编程中使用 flag 库的最佳实践
提前定义所有的标志:
你应该在程序的开始就定义所有可能用到的命令行参数。这样,在调用flag.Parse()
后,你可以确保所有的命令行参数都已经被正确解析。并且,当用户输入了未定义的参数时,程序会自动打印出错误信息并退出。使用恰当的默认值:
flag 库允许你为命令行参数设定默认值。你应该为每一个参数设定一个恰当的默认值,以便在用户没有提供该参数时,程序仍能正常运行。提供清晰的参数描述:
当定义一个参数时,你需要提供一个简短的描述,说明这个参数的作用。这个描述将会在用户输入-help
参数时被打印出来。确保向后兼容:
如果你的程序已经在生产环境中使用了一段时间,那么你可能需要考虑向后兼容性。在这种情况下,当你需要改变一个已有参数的名字或者语义时,你应该新增一个参数,而不是修改旧的参数。你可以在旧的参数的描述中提示用户,这个参数已经被废弃,并指向新的参数。
1.5 参考
Go标准库flag包的“小陷阱”_flag.bool-CSDN博客
更多该系列文章,参考medium链接:
https://wesley-wei.medium.com/list/you-should-know-in-golang-e9491363cd9a
English post: https://programmerscareer.com/golang-flag/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。
评论