1

此代码解析命令行参数。如果我输入“/netstat -c /etc/config -I eth0”,它应该是:“c /etc/config \ni 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()

}
4

3 回答 3

1

作为使用临时变量的替代方法,您可以使用 flag.StringVar() 填充已经初始化的结构,如下所示:

flag.StringVar(&cmdSt.configPtr, "c", "configfile", "configure file to parse ")
flag.StringVar(&cmdSt.interfacePtr, "i", "interface", "capture network interface")

然后您可以立即调用该值。

https://play.golang.org/p/RkW7YKfE8t8

于 2019-02-21T04:20:54.997 回答
1

在设置默认值之后和解析命令行之前,应用程序取消引用从 flag.String 返回的指针。结果,cmdSt 字段被设置为默认值。

通过使用flag.xxxVar()函数进行修复。这些函数将标志值存储到应用程序分配的值中。

flag.StringVar(&cmdSt.configPtr, "c", "configfile", "configure file to parse ")
flag.StringVar(&cmdSt.interfacePtr, "i", "interface", "capture network interface")
flag.Parse()

// cmdSt.configPtr and cmdSt.interfacePtr are now set to
// command flag value or default if the flag was 
// not specified.
于 2019-02-21T04:21:53.487 回答
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)
于 2019-02-21T04:02:30.967 回答