Come convertire l'interfaccia {} in una stringa?


114

Sto usando docopt per analizzare gli argomenti della riga di comando. Funziona e si ottiene una mappa come

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

Ora vorrei concatenare il hoste il portvalore in una stringa con i due punti tra i due valori. Fondamentalmente, qualcosa come:

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

Sfortunatamente, questo non funziona, poiché ricevo il messaggio di errore:

operazione non valida: argomenti [""] + ":" (tipi di interfaccia {} e stringa non corrispondenti)

Quindi ovviamente ho bisogno di convertire il valore che ottengo dalla mappa (che è giusto interface{}, quindi può essere qualsiasi cosa) in una stringa. Ora la mia domanda è: come posso farlo?


Risposte:


153

Devi aggiungere un'asserzione di tipo .(string) . È necessario perché la mappa è di tipo map[string]interface{}:

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

Ultima versione di Docopt ritorna Opz oggetto che dispone di metodi per la conversione:

host, err := arguments.String("<host>")
port, err := arguments.String("<port>")
host_port := host + ":" + port

7
Vorrei aggiungere che questo si chiama Asserzione del tipo - golang.org/ref/spec#Type_assertions . Una volta ho avuto problemi a capire questa terminologia esatta.
Sreejith Ramakrishnan


89

Non è necessario utilizzare un'asserzione di tipo, utilizza invece l' %videntificatore di formato con Sprintf:

hostAndPort := fmt.Sprintf("%v:%v", arguments["<host>"], arguments["<port>"])

Questa era l'unica cosa che riuscivo a far funzionare per me quando provavo a digitare le interfacce cast {} con come stringhe.
FilBot3

1
Per me, questo non ha funzionato. Questo ha finito per stampare i grafici ASCII a byte invece della stringa, come 201 diventa "[50,48,49]", quindi ho finito per usare fmt.Sprintf ("% s", theThing) invece ...
Felipe Valdes

18

Per espandere ciò che ha detto Peter: poiché stai cercando di passare dall'interfaccia {} alla stringa, l'asserzione del tipo porterà a mal di testa poiché devi tenere conto di più tipi in entrata. Dovrai affermare ogni tipo possibile e verificare che sia quel tipo prima di usarlo.

L'utilizzo di fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) gestisce automaticamente la conversione dell'interfaccia. Poiché sai che il tuo tipo di output desiderato è sempre una stringa, Sprintf gestirà qualsiasi tipo si trovi dietro l'interfaccia senza un mucchio di codice aggiuntivo per tuo conto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.