为什么我无法在Go中将指针字符串转换为字符串?

时间:2019-02-21 02:40:12

标签: go

此代码解析命令行参数。如果我键入“ / 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()

}

3 个答案:

答案 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")

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

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

答案 2 :(得分:1)

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

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

requires.txt