Go 语言 程序的命令行,除了可以使用 os.Args 来获取,还可以通过 flag 包相关的 函数 来获取。
os.Args 获取方式只能根据索引一个个去遍历获取,但 flag 包提供的方式更为灵活,可以通过 key 和 value 的形式来获取。
flag.StringVar(&user, "u", "root", "账号,默认为root")
flag.IntVar(&port, "P", 3306, "端口号,默认为3306")
参数 | 描述 |
---|---|
StringVar | 获取命令行参数的对应的类型,常用的有 IntVar,StringVar,BoolVar,Float64Var,Int64Var,Uint64Var,UintVar 等,分别用户获取 int,string,bool,float64,int64,uint64 和 uint 类型的参数。 |
&user | 所获取的值,存储的变量。 |
u | 命令行的 key。 |
root | 命令行的默认值。 |
账号 | 文字说明。 |
我们分别通过了 flag.StringVar 和 flag.IntVar 解析了命令行的字符串类型的参数和 int 类型的参数。
flag.String("u", "root", "账号,默认为root")
flag.Int("P", 3306, "端口号,默认为3306")
这个获取命令行参数的形式类似于第一种,但这一种获取的命令行的值是通过 函数返回值 的形式返回的。
通过 flag 包解析命令行参数
package main
import (
"flag"
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
// 定义几个变量,用于接收命令行的参数值
var user string
var password string
var host string
var port int
// &user 就是接收命令行中输入 -u 后面的参数值,其他同理
flag.StringVar(&user, "u", "root", "账号,默认为root")
flag.StringVar(&password, "p", "", "密码,默认为空")
flag.StringVar(&host, "h", "localhost", "主机名,默认为localhost")
flag.IntVar(&port, "P", 3306, "端口号,默认为3306")
// 解析命令行参数写入注册的flag里
flag.Parse()
// 输出结果
fmt.Printf("user:%v\npassword:%v\nhost:%v\nport:%v\n",
user, password, host, port)
}
程序运行后,控制台输出如下:
我们在 main 函数里面解析命令行参数,最后运行的时候,我们发现,我们指定了参数 u 和 p ,因此最终的 user 和 password 参数的值就是我们指定的值,而我们没有指定的参数 h 和 P ,就使用的是默认值。
通过 flag 包解析命令行参数
package main
import (
"flag"
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
// 定义几个变量,用于接收命令行的参数值
var user *string
var password *string
var host *string
var port *int
// &user 就是接收命令行中输入 -u 后面的参数值,其他同理
user = flag.String("u", "root", "账号,默认为root")
password = flag.String("p", "", "密码,默认为空")
host = flag.String("h", "localhost", "主机名,默认为localhost")
port = flag.Int("P", 3306, "端口号,默认为3306")
// 解析命令行参数写入注册的flag里
flag.Parse()
// 输出结果
fmt.Printf("user:%v\npassword:%v\nhost:%v\nport:%v\n",
*user, *password, *host, *port)
}
程序运行后,控制台输出如下:
这一种方法类似第一种,同样实现了命令行参数的解析。
flag 包提供的命令行参数解析的方式可以通过 key 和 value 的形式来获取。Go 语言解析命令行参数语法:
flag.StringVar(&user, "u", "root", "账号,默认为root")
flag.IntVar(&port, "P", 3306, "端口号,默认为3306")
也可以使用:
flag.String("u", "root", "账号,默认为root")
flag.Int("P", 3306, "端口号,默认为3306")