此代码解析命令行参数。如果我键入“ / netstat -c / etc / config -I eth0”,则应为:“ c / etc / config \ n i eth0”, 但是不是。终端输出为:
c配置文件
c界面
./netstat -c /etc/config -i eth0
c configfile
c interface
代码如下:
package main
import (
"flag"
"fmt"
)
type CmdSt struct {
configPtr string
interfacePtr string
}
var cmdSt CmdSt
func usage() {
cmdSt.configPtr = *flag.String("c", "configfile", "configure file to parse ")
cmdSt.interfacePtr = *flag.String("i", "interface", "capture network interface")
/*
a := flag.String("c", "configfile", "configure file to parse ")
b := flag.String("i", "interface", "capture network interface")
*/
flag.Parse()
fmt.Println("c", cmdSt.configPtr)
fmt.Println("i", cmdSt.interfacePtr)
/*
fmt.Println("c:", *a)
fmt.Println("i:", *b)
*/
}
func main() {
usage()
}
答案 0 :(得分:1)
这是因为在调用flag.Parse()
之前,您仍保留默认值:
// still holding the "configfile" as value
cmdSt.configPtr = *flag.String("c", "configfile", "configure file to parse ")
// still holding the "interface" as value
cmdSt.interfacePtr = *flag.String("i", "interface", "capture network interface")
// flag is parsed now, but both cmdSt.configPtr and cmdSt.interfacePtr still holding the default value because of the pointer.
flag.Parse()
您可以通过使用临时变量来解决问题:
// hold the value to temporary variables
a := flag.String("c", "configfile", "configure file to parse ")
b := flag.String("i", "interface", "capture network interface")
// parse the flag and save to the variables.
flag.Parse()
// now, point the value to the CmdSt struct
cmdSt.configPtr = *a
cmdSt.interfacePtr = *b
fmt.Println("c", cmdSt.configPtr)
fmt.Println("i", cmdSt.interfacePtr)
答案 1 :(得分:1)
作为使用临时变量的替代方法,可以使用flag.StringVar()填充已初始化的结构,如下所示:
flag.StringVar(&cmdSt.configPtr, "c", "configfile", "configure file to parse ")
flag.StringVar(&cmdSt.interfacePtr, "i", "interface", "capture network interface")
然后您可以立即调用该值。
答案 2 :(得分:1)
在设置了默认值之后并且在解析命令行之前,应用程序取消引用从flag.String返回的指针。结果,将cmdSt字段设置为默认值。
使用flag.xxxVar()函数进行修复。这些函数将标志值存储到应用程序分配的值中。
requires.txt