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?


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

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>"])

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.