在命令行工具的开发过程中,我们常常需要设置一个同时支持短名称和长名称的选项,如 -d 等价于 --debug-p 等价于 --password。在使用 Go flag 包的情况下,该需求的实现相当简单,只需要定义两个不同的 flag 指向同一个变量即可。

代码

// flag_shorthand.go
package main

import (
	"flag"
	"fmt"
)

func main() {
	var debug bool
	var password string
	debugUsage := "run in debug mode"
	passwordUsage := "type password"

	flag.BoolVar(&debug, "d", false, debugUsage)
	flag.BoolVar(&debug, "debug", false, debugUsage)
	flag.StringVar(&password, "p", "", passwordUsage)
	flag.StringVar(&password, "password", "", passwordUsage)
	flag.Parse()

	fmt.Printf("debug: %v\n", debug)
	fmt.Printf("password: %s\n", password)
}

运行

不带任何参数

debugpassword 都使用默认值,分别为 false""

$ go run flag_shorthand.go
debug: false
password: 

使用短名称

$ go run flag_shorthand.go -d -p 12345
debug: true
password: 12345

使用长名称

$ go run flag_shorthand.go --debug --password=12345
debug: true
password: 12345

小结

学习并掌握了长短名称选项的使用方式,代码