почему я не могу преобразовать строку указателя в строку в Go? - PullRequest
0 голосов
/ 21 февраля 2019

Этот код разбирает аргументы командной строки.Если я наберу "/ netstat -c / etc / config -I eth0", это должно быть: "c / etc / config \ ni eth0", но это не так.Выход терминала:

c configfile

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 голосов
/ 21 февраля 2019

В качестве альтернативы использованию временных переменных вы можете заполнить свою уже инициализированную структуру с помощью 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

0 голосов
/ 21 февраля 2019

Приложение разыменовывает указатель, возвращенный из 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.
0 голосов
/ 21 февраля 2019

Это потому, что вы все еще удерживаете значение по умолчанию до вызова 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...