本篇文章主要介绍如何使用flag包解析字符串,没有介绍flag包的详细使用,需要学习flag包如何使用的同学可以参考如下这篇文章:
Go语言中使用flag包对命令行进行参数解析的方法 https://www.jb51.net/article/82812.htm
Golang的flag包类似于c语言里面的getopt, getopt_long函数,都是用来解析命令行字符串的类似于如下格式
iptables -A INPUT -i eth0 -p tcp -j ACCEPT
首个字符串是程序名字,后面都是参数,这些参数可以使用flag包来解析。当然这是命令行提供字符串,如果字符串由其它来源提供的话,比如说程序启动后,收到字符串参数,这时候就不能够直接调用flag.Parse()来解析了,因为默认是从os.Args字符串切片中解析,flag包Parse源码
// Parse parses the command-line flags from os.Args[1:]. Must be called
// after all flags are defined and before flags are accessed by the program.
//默认从os.Args字符串切片中解析
func Parse() {
// Ignore errors; CommandLine is set for ExitOnError.
CommandLine.Parse(os.Args[1:])
}
这种情况下只需要构造好os.Args就又能够使用了,比如下面的例子:
//先将字符串分割成字符串切片
flags := strings.Split(Cmd, " ")
//重新构造os.Args
os.Args = os.Args[:0]
//将字符串切片追加到os.Args中
for _, value := range flags {
os.Args = append(os.Args, value)
}
//调用flag包解析
flag.Parse()
使用flag前需要绑定好参数,参数只需绑定一次,多了会报错,如果重复调用flag.Parse的话,每次使用前需要将参数初始化,不然可能会残留上一次解析后的值