Go 标志
最后修改时间 2024 年 4 月 11 日
在本文中,我们将展示如何使用 flag 包在 Golang 中解析命令行参数。
flag
包实现了命令行标志解析。命令行参数可在 os.Args
切片中找到。flag
包允许对其进行更灵活的处理。
此外,还有一些第三方包,例如 Cobra,提供了更多附加功能。
func String(name string, value string, usage string) *string func StringVar(p *string, name string, value string, usage string)
flag
包包含多个用于解析不同类型标志的函数。每种标志类型都有两种选择。区别在于第一个返回指向变量的指针,而另一个接受指向变量的指针。
使用 flag.Args
,我们可以解析非标志参数;这些参数必须跟在标志参数后面。
Go 标志语法
编写标志有几种方式。
-count=x -count x --count=x --count x
这些是除布尔值以外所有类型的选项。
-upper --upper -upper=value --upper=value
布尔标志有以下选项。
Go 标志简单示例
下面的示例是一个简单的程序,它解析一个整数参数。
package main import ( "flag" "fmt" ) func main() { num := flag.Int("n", 5, "# of iterations") flag.Parse() n := *num i := 0 for i < n { fmt.Println("falcon") i++ } }
该程序将单词“falcon”打印 n 次;n 值从命令行参数解析。
import ( "flag" "fmt" )
首先,我们导入 flag
包。
num := flag.Int("n", 5, "# of iterations")
我们使用 flag.Int
注册一个 int 标志。第一个参数是标志的名称,第二个是默认值,第三个是标志的描述。
flag.Parse()
我们使用 flag.Parse
处理标志。
n := *num
由于我们使用了返回指向变量的指针的函数,因此我们解引用指针并获取值。
for i < n { fmt.Println("falcon") i++ }
我们将单词“falcon”打印 n 次。
$ go run simple.go falcon falcon falcon falcon falcon $ go run simple.go -n 3 falcon falcon falcon
Go flag.String & flag.Int
flag.String
使用指定的名称、默认值和用法字符串定义一个字符串标志。返回值是存储标志值的字符串变量的地址。flag.Int
使用指定的名称、默认值和用法字符串定义一个 int 标志。返回值是存储标志值的 int 变量的地址。
package main import ( "flag" "fmt" ) var ( env *string port *int ) func init() { env = flag.String("env", "development", "current environment") port = flag.Int("port", 3000, "port number") } func main() { flag.Parse() fmt.Println("env:", *env) fmt.Println("port:", *port) }
该程序使用两个标志:环境选项和端口号。
func init() { env = flag.String("env", "development", "current environment") port = flag.Int("port", 3000, "port number") }
我们可以将我们的语句放在 init
函数中,该函数通常用于初始化状态变量。
$ go run string_int.go env: development port: 3000 $ go run string_int.go -port 8080 env: development port: 8080
Go flag.StringVar
flag.StringVar
使用指定的名称、默认值和用法字符串定义一个字符串标志。第一个参数指向一个字符串变量,标志的值将存储在该变量中。
package main import ( "flag" "fmt" ) func main() { var name string flag.StringVar(&name, "name", "guest", "your name") flag.Parse() fmt.Printf("Hello %s\n", name) }
该示例从命令行获取用户的名字。
$ go run stringvar.go Hello guest $ go run stringvar.go -name Peter Hello Peter
Go flag.PrintDefaults
flag.PrintDefaults
打印集合中所有已定义命令行标志的默认值。
package main import ( "flag" "fmt" "os" ) func main() { var name string flag.StringVar(&name, "name", "", "your name") flag.Parse() if len(name) == 0 { fmt.Println("Usage: defaults.go -name") flag.PrintDefaults() os.Exit(1) } fmt.Printf("Hello %s\n", name) }
该程序注册了 name
标志并使其成为必需的。
if len(name) == 0 { fmt.Println("Usage: defaults.go -name") flag.PrintDefaults() os.Exit(1) }
如果 name 变量为空,我们将打印程序的用法。
$ go run defaults.go Usage: defaults.go -name -name string your name exit status 1
Go flag.BoolVar
flag.BoolVar
使用指定的名称、默认值和用法字符串定义一个 bool 标志。第一个参数指向一个 bool 变量,标志的值将存储在该变量中。
package main import ( "flag" "fmt" "strings" ) func main() { var name string var upper bool flag.StringVar(&name, "name", "guest", "your name") flag.BoolVar(&upper, "u", false, "display in uppercase") flag.Parse() var msg string msg = fmt.Sprintf("Hello %s", name) if upper { fmt.Println(strings.ToUpper(msg)) } else { fmt.Println(msg) } }
该程序获取用户的名字和一个布尔标志,用于确定是否将消息写入大写。
$ go run boolean.go -name Peter Hello Peter $ go run boolean.go -name Peter -u HELLO PETER
Go flag.Args
标志后面的参数可作为切片 flag.Args
或单独作为 flag.Arg(i)
访问。参数的索引从 0 到 flag.NArg() - 1
。
package main import ( "flag" "fmt" "os" "strings" ) func main() { var u bool flag.BoolVar(&u, "u", false, "display in uppercase") flag.Parse() values := flag.Args() if len(values) == 0 { fmt.Println("Usage: nonflags.go [-u] words ...") flag.PrintDefaults() os.Exit(1) } for _, word := range values { if u { fmt.Println(strings.ToUpper(word)) } else { fmt.Println(word) } } }
该程序有一个 u
标志,用于将标志后的所有单词打印为大写。
flag.BoolVar(&u, "u", false, "display in uppercase")
我们定义了布尔标志。
values := flag.Args()
我们从终端获取所有单词。
for _, word := range values { if u { fmt.Println(strings.ToUpper(word)) } else { fmt.Println(word) } }
我们遍历切片并打印单词;如果设置了 uppercase 标志,则单词将以大写形式打印。
$ go run nonflags.go sky blue falcon cup ocean sky blue falcon cup ocean $ go run nonflags.go -u sky blue falcon cup ocean SKY BLUE FALCON CUP OCEAN
来源
在本文中,我们使用 flag 包在 Golang 中解析了命令行参数。