os包中的Args是一个string的切片,用来存储所有的命令行参数
案例
package main
import (
"fmt"
"os"
)
func main(){
fmt.Println("命令行的参数有",len(os.Args))
//变量os.Args切片,会将所有命令行参数存储到os.Args切片中
//然后我们通过for-range去遍历切片打印出传入的参数
for i,v := range os.Args{
fmt.Printf("args[%v]=%v\n",i,v)
}
}
测试
D:\go_setup\go1.17\src\go_code\main\main>go run main.go abc e:/xxx 123
命令行的参数有 4
args[0]=C:\Users\xx\AppData\Local\Temp\go-build3125450602\b001\exe\main.exe
args[1]=abc
args[2]=e:/xxx
args[3]=123
可以看到,当我们在运行程序时在后面添加的参数会以切片形式存储在os.Args中
命令行解析工具flag
os.Args 有一些缺陷,如果顺序写错了,那么就使用错误了,要严格按照顺序去输入
语法说明
#函数,接收string类型数值的命令行解析
func StringVar(p *string, name string, value string, usage string)
#参数解析
p *string //用于将命令行传入的值存放到我们设置的变量中
name string //指定接收我们命令行参数 中key/value中key的存在,比如 --name
value string //参数默认值,当我们没有指定命令行参数时的值,比如--name=""
usage string //说明信息,当用户不会使用该命令行时的提示信息
案例
package main
import (
"flag"
"fmt"
)
func main(){
// 定义几个变量,用于接收命令行的参数值
var user string
var pwd string
var host string
var port int
//设置我们的命令行参数
flag.StringVar(&user,"u","","用户名,默认为空")
flag.StringVar(&pwd,"p","","密码,默认为空")
flag.StringVar(&host,"h","localhost","主机名,默认为localhost")
flag.IntVar(&port,"port",3306,"端口号默认为3306")
flag.Parse() //注册flag
//从os.Args[1:]中解析注册的flag。
//必须在所有flag都注册好而未访问其值时执行
//未注册却使用flag -help时,会返回ErrHelp。
fmt.Printf("user=%v pwd=%v host=%v port=%v",user,pwd,host,port)
}
测试
D:\go_setup\go1.17\src\go_code\main\main>go run main.go -u root -p 123456 -h 192.168.1.2 -port 3306
user=root pwd=123456 host=192.168.1.2 port=3306
我们在输入参数的时候,单横杠或双横杠都可以,在传值时空格或等于号都可以