小白必学:Go语言中flag包的使用教程

发表时间: 2024-10-03 18:49

使用Go语言开发命令行工具的时候免不了要处理命令行参数,一种直接的方法是通过os.Args获取到命令行的所有参数,然后自己来解析,稍微麻烦并有一定的局限性。为了更方便地处理命令行参数,Go官方提供了flag包,专门来解析命令行参数。

解析命令行参数一般过程是先定义命令行flags,定义好之后进行Parse解析获取命令行参数到相应变量中,下面通过几个例子来看一下。

  • 通过os.Args来获取命令行参数,代码如下:
package mainimport (	"fmt"	"os")func main() {	args := os.Args	fmt.Println(args)}

运行输出如下:

通过os.Args获取到的参数

可以看到os.Args会将所有命令行参数都放到一个字符串slice中,可以对获取到参数做相应处理。

  • 通过flag来获取命令行参数,代码如下:
package mainimport (	"fmt"	// "os"	"flag")func main() {	aflag := flag.Int("a", 0, "a flag") //定义名字为a的flag	bflag := flag.Int("b", 0, "b flag") //定义名字为b的flag	cflag := flag.Int("c", 0, "c flag") //定义名字为c的flag	dflag := flag.Int("d", 0, "d flag") //定义名字为d的flag	flag.Parse() //解析参数	fmt.Println(*aflag, *bflag, *cflag, *dflag, flag.Args()) //输出获取的参数}

运行输出如下:

通过flag获取到的参数

注意,flag.Parse()需要放在flags的定义之后来解析flag。

可以看到aflag获取到了-a参数1,bflag获取到了-b参数2,而cflag和dflag未获取到参数输出默认值0,因为要求flag以-或者--开头。未解析的参数会以字符串slice的形式存在flag.Args中。

  • 通过flag.FlagSet来获取命令行参数,代码如下:
package mainimport (	"fmt"	"os"	"flag")func main() {	fs := flag.NewFlagSet("", flag.ExitOnError) //创建一个FlagSet	aflag := fs.Int("a", 0, "a flag") //定义名字为a的flag	bflag := fs.Int("b", 0, "b flag") //定义名字为b的flag	cflag := fs.Int("c", 0, "c flag") //定义名字为c的flag	dflag := fs.Int("d", 0, "d flag") //定义名字为d的flag	fs.Parse(os.Args[1:]) //从下标1的参数开始解析	fmt.Println(*aflag, *bflag, *cflag, *dflag, fs.Args()) //输出获取的参数}

运行输出如下:

通过flag.FlagSet获取到的参数

可以看到获取到了与flag同样的参数,未解析的参数会以字符串slice的形式存在fs.Args()中。其实上面通过flag解析参数底层就是通过FlagSet实现的。

注意,这里调用Parse方法传参是从os.Args中下标1开始的。这里的Parse方法可以传自己的参数,未必一定是从命令行获取到的参数,这是自定义FlagSet比使用flag灵活的一点。

本文解析flag是以int类型为例子演示的,其实参数还可以是string,bool,float等类型,甚至你也可以自定义类型。