Wie konvertiere ich die Schnittstelle {} in einen String?

113

Ich verwende docopt , um Befehlszeilenargumente zu analysieren. Dies funktioniert und führt zu einer Karte, wie z

map[<host>:www.google.de <port>:80 --help:false --version:false]

Jetzt möchte ich den hostund den portWert zu einem String mit einem Doppelpunkt zwischen den beiden Werten verketten . Grundsätzlich etwas wie:

host := arguments["<host>"] + ":" + arguments["<port>"]

Leider funktioniert das nicht, da ich die Fehlermeldung bekomme:

ungültige Operation: Argumente [""] + ":" (nicht übereinstimmende Typenschnittstelle {} und Zeichenfolge)

Also muss ich natürlich den Wert, den ich von der Karte bekomme (was einfach ist interface{}, damit es alles sein kann), in eine Zeichenfolge konvertieren . Meine Frage ist nun, wie mache ich das?

Golo Roden
quelle

Antworten:

152

Sie müssen hinzufügen Typ Behauptung .(string) . Dies ist erforderlich, da die Karte vom Typ ist map[string]interface{}:

host := arguments["<host>"].(string) + ":" + arguments["<port>"].(string)

Die neueste Version von Docopt gibt ein Opts- Objekt mit Konvertierungsmethoden zurück:

host, err := arguments.String("<host>")
port, err := arguments.String("<port>")
host_port := host + ":" + port
Grzegorz Żur
quelle
7
Ich möchte hinzufügen, dass dies als Typzusicherung bezeichnet wird - golang.org/ref/spec#Type_assertions . Ich hatte einmal Probleme, diese genaue Terminologie herauszufinden.
Sreejith Ramakrishnan
Es wird eine Panik auslösen, wenn Argumente ["<Host>"] gleich Null sind
Savash
89

Sie müssen keine Typzusicherung verwenden, sondern verwenden einfach den %vFormatbezeichner mit Sprintf:

hostAndPort := fmt.Sprintf("%v:%v", arguments["<host>"], arguments["<port>"])
Peter Stace
quelle
Dies war das einzige, was ich für mich arbeiten konnte, wenn ich versuchte, Cast-Schnittstellen {} als Zeichenfolgen einzugeben.
FilBot3
1
Für mich hat das nicht funktioniert. Dies führte dazu, dass die Byte-ASCII-Diagramme anstelle der Zeichenfolge gedruckt wurden, wie 201 zu "[50,48,49]", sodass ich stattdessen fmt.Sprintf ("% s", theThing) verwendete ...
Felipe Valdes
18

Um das zu erweitern, was Peter gesagt hat: Da Sie von der Schnittstelle {} zur Zeichenfolge wechseln möchten, führt die Typzusicherung zu Kopfschmerzen, da Sie mehrere eingehende Typen berücksichtigen müssen. Sie müssen jeden möglichen Typ bestätigen und überprüfen, ob es sich um diesen Typ handelt, bevor Sie ihn verwenden.

Die Verwendung von fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) übernimmt automatisch die Schnittstellenkonvertierung. Da Sie wissen, dass Ihr gewünschter Ausgabetyp immer eine Zeichenfolge ist, verarbeitet Sprintf jeden Typ, der sich hinter der Schnittstelle befindet, ohne zusätzlichen Code in Ihrem Namen.

Justitan
quelle