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

我们在输入参数的时候,单横杠或双横杠都可以,在传值时空格或等于号都可以