golang中你应该知道的flag库知识

命令行参数,常见陷阱,以及Go编程的最佳实践
photo by Hannah C on Unsplash

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"flag"
"fmt"
)

func main() {
length := flag.Float64("length", 2.0, "The length of the rectangle")
width := flag.Float64("width", 2.0, "The width of the rectangle")

flag.Parse()
area := *length * *width
fmt.Println("The area of the rectangle is", area)
}

// run
go run main.go -length=4 -width=5

// result
The area of the rectangle is 20

注意调用 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 库的最佳实践

  1. 提前定义所有的标志:
    你应该在程序的开始就定义所有可能用到的命令行参数。这样,在调用 flag.Parse() 后,你可以确保所有的命令行参数都已经被正确解析。并且,当用户输入了未定义的参数时,程序会自动打印出错误信息并退出。

  2. 使用恰当的默认值:
    flag 库允许你为命令行参数设定默认值。你应该为每一个参数设定一个恰当的默认值,以便在用户没有提供该参数时,程序仍能正常运行。

  3. 提供清晰的参数描述:
    当定义一个参数时,你需要提供一个简短的描述,说明这个参数的作用。这个描述将会在用户输入 -help 参数时被打印出来。

  4. 确保向后兼容:
    如果你的程序已经在生产环境中使用了一段时间,那么你可能需要考虑向后兼容性。在这种情况下,当你需要改变一个已有参数的名字或者语义时,你应该新增一个参数,而不是修改旧的参数。你可以在旧的参数的描述中提示用户,这个参数已经被废弃,并指向新的参数。

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
注意:本文为作者原创,转载请注明出处。

golang中你应该知道的nil知识 我的前端学习之路:Medium Stats Insights 1.1.2 版本

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×