1 获取命令行参数
main.go
package mainimport ( "fmt" "os")func main() { var s, sep string for i := 0; i < len(os.Args); i++ { s += sep + os.Args[i] sep = " " } fmt.Println(s) fmt.Println(os.Args[1:]) //输出切片}
D:\Go\study\src>go build main.go
D:\Go\study\src>bingfa.exe -a -b -c -d
bingfa.exe -a -b -c -d
[-a -b -c -d]
程序说明:
1.获得命令行参数需要使用包"os";
2.命令行参数通过包"os"传递, 参数存放在切片(slice)中, 其名字为os.Args[], os.Args[0]是命令本身, 其他的os.Args[i]则是命令的各个选项;
3.包"os"中, 还有os.Stdin等, 其含义一目了然;
实例: 获取命令行参数
package main //必须有个main包import( "fmt" "os" //os.Args 所需的包)func main(){ args := os.Args //获取用户输入的所有参数 //如果用户没有输入, 或参数个数不够, 则调用该函数提示用户 if args == nil || len(args) < 2{ fmt.Println("err: xxx ip port") return } ip := args[1] //获取输入的第一个参数 port := args[2] //获取输入的第二个参数 fmt.Printf("ip = %s, port = %s\n", ip, port) //ip = 127.0.0.1, port = 88889 fmt.Println(len(args))}
执行方法:
go build getCommandParam.go
getCommandParam 127.0.0.1 8888
ip = 127.0.0.1, port = 8888
3
go run getCommandParam.go 127.0.0.1 3369
ip = 127.0.0.1, port = 3369
3
2 flag包对命令行参数的解析
上面的参数解析只是从命令行当中把参数存储在os.Args切片当中, 应用的时候, 不是很方便, 特别是, 编译好的一个可执行文件, 别人不知道如何使用的时候,
可以使用Go内置的flag包对参数进行说明, 并可设置默认值。
flag包的使用方法
flag.Type("flagName",defaultValue,"help message") *Type
flag包依据Type的类型, 和参数标志flagName, 对标志flagName设置默认值和帮助信息, 最终返回一个指向该类型的指针, 可以通过指针是否为空来判断命令行里是否使用该标志参数, 下面是一个例子。
package mainimport ( "flag" "fmt")var b = flag.Bool("b", false, "bool类型参数") //bool型的数据不需要输入值, 否则会导致后面的参数无法接收var s = flag.String("s", "", "string类型参数")func main() { flag.Parse() fmt.Println("-b:", *b) fmt.Println("-s:", *s) fmt.Println("其他参数:", flag.Args())}
$ go run main.go
-b: false
-s:
其他参数: []
$ go run main.go -b
-b: true
-s:
其他参数: []
$ go run main.go -b -s test others
-b: true
-s: test
其他参数: [others]
$ go run main.go -help
Usage of /tmp/go-build080353851/command-line-arguments/_obj/exe/main:
-b bool类型参数
-s string
string类型参数
exit status 2
步骤:
1 定义参数
使用flag包, 首先定义待解析命令行参数, 也就是以"-"开头的参数, 比如这里的 -b -s -help等。-help不需要特别指定, 可以自动处理。
这里指定了两个参数,-b和-s:
var b = flag.Bool("b", false, "bool类型参数")
var s = flag.String("s", "", "string类型参数")
原型:
func Bool(name string, value bool, usage string) *bool
func String(name string, value string, usage string) *string
通过flag.Bool和flag.String, 建立了2个指针b和s, 分别指向bool类型和string类型的变量。所以后续要通过 *b 和 *s 使用变量值。
flag.Bool和flag.String的参数有3个, 分别是命令行参数名称, 默认值, 提示字符串。
参数 功能
name 命令行参数名称, 比如 -b, -help
value 默认值, 未显式指定的参数, 给出隐式的默认值, 比如本例中-b未给出的话, *b=false
usage 提示信息, 如果给出的参数不正确或者需要查看帮助 -help, 那么会给出这里指定的字符串
2 解析参数
flag使用前, 必须首先解析:
flag.Parse()
3 使用参数
上文已经说明, 通过flag方法定义好的参数变量指针, 通过间接引用操作即可使用其内容:
fmt.Println("-b:", *b)
fmt.Println("-s:", *s)
4 未解析参数
参数中没有能够按照预定义的参数解析的部分, 通过flag.Args()即可获取, 是一个字符串切片。
fmt.Println("其他参数:", flag.Args())
需要注意的是, 从第一个不能解析的参数开始, 后面的所有参数都是无法解析的。即使后面的参数中含有预定义的参数:
$ go run main.go -b stop -s test others
-b: true
-s:
其他参数: [stop -s test others]