一 问题引出
我们希望能够获取到命令行输入的各种参数,该如何处理?
二 点睛
os.Args 是一个 string 的切片,用来存储所有的命令行参数。
三 实战
1 需求
编写一段代码,可以获取命令行各个参数。
2 代码
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("命令行的参数有", len(os.Args))
// 遍历 os.Args 切片,就可以得到所有的命令行输入参数值
for i, v := range os.Args {
fmt.Printf("args[%v]=%v\n", i, v)
}
}
3 测试
E:\gocode\src\chapter14\argsdemo>test.exe tom c:/aaa/bbb/test.log 99
命令行的参数有 4
args[0]=test.exe
args[1]=tom
args[2]=c:/aaa/bbb/test.log
args[3]=99
四 flag 包用来解析命令行参数
1 说明
前面的方式是比较原生的方式,对解析参数不是特别的方便,特别是带有指定参数形式的命令行。
例如:cmd>main.exe -f c:/aaa.txt -p 200 -u root 这样的形式命令行,go 设计者给我们提供了 flag包,可以方便的解析命令行参数,而且参数顺序可以随意。
编写一段代码,可以获取命令行各个参数。
2 代码
package main
import (
"flag"
"fmt"
)
func main() {
// 定义几个变量,用于接收命令行的参数值
var user string
var pwd string
var host string
var port int
// &user 就是接收用户命令行中输入的 -u 后面的参数值
// "u" ,就是 -u 指定参数
// "" , 默认值
// "用户名,默认为空" 说明
flag.StringVar(&user, "u", "", "用户名,默认为空")
flag.StringVar(&pwd, "pwd", "", "密码,默认为空")
flag.StringVar(&host, "h", "localhost", "主机名,默认为localhost")
flag.IntVar(&port, "port", 3306, "端口号,默认为3306")
// 这里有一个非常重要的操作,转换, 必须调用该方法
flag.Parse()
// 输出结果
fmt.Printf("user=%v pwd=%v host=%v port=%v",
user, pwd, host, port)
}
3 测试
E:\gocode\src\chapter14\flagdemo>flagdemo.exe -u root -pwd 123456 -h 127.0.0.1 -port 3306
user=root pwd=123456 host=127.0.0.1 port=3306