J'utilise docopt pour analyser les arguments de ligne de commande. Cela fonctionne, et il en résulte une carte, telle que
map[<host>:www.google.de <port>:80 --help:false --version:false]
Maintenant, je voudrais concaténer le host
et la port
valeur en une chaîne avec un deux-points entre les deux valeurs. Fondamentalement, quelque chose comme:
host := arguments["<host>"] + ":" + arguments["<port>"]
Malheureusement, cela ne fonctionne pas, car je reçois le message d'erreur:
opération non valide: arguments [""] + ":" (interface de types incompatibles {} et chaîne)
Donc, évidemment, je dois convertir la valeur que j'obtiens de la carte (ce qui est juste interface{}
, donc ça peut être n'importe quoi) en une chaîne. Maintenant ma question est, comment puis-je faire cela?
Réponses:
Vous devez ajouter une assertion de type
.(string)
. C'est nécessaire car la carte est de typemap[string]interface{}
:La dernière version de Docopt renvoie l' objet Opts qui a des méthodes de conversion:
la source
Vous n'avez pas besoin d'utiliser une assertion de type, utilisez simplement le
%v
spécificateur de format avecSprintf
:la source
Pour développer ce que Peter a dit: Puisque vous cherchez à passer de l'interface {} à la chaîne, l'assertion de type entraînera des maux de tête puisque vous devez tenir compte de plusieurs types entrants. Vous devrez affirmer chaque type possible et vérifier qu'il s'agit de ce type avant de l'utiliser.
L'utilisation de fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) gère automatiquement la conversion d'interface. Puisque vous savez que le type de sortie souhaité est toujours une chaîne, Sprintf gérera tout type derrière l'interface sans un tas de code supplémentaire en votre nom.
la source