J'utilise docopt pour analyser les arguments de la 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 la valeur Host
et la valeur port
en une chaîne avec un signe 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 suivant:
opération non valide: arguments [""] + ":" (types incompatibles interface {} et chaîne)
Il est donc évident que je dois convertir la valeur que je récupère de la carte (qui est simplement interface{}
, donc cela peut être n'importe quoi) en chaîne. Maintenant ma question est, comment je fais cela?
Vous devez ajouter type assertion.(string)
. C'est nécessaire car la carte est de type map[string]interface{}
:
Host := arguments["<Host>"].(string) + ":" + arguments["<port>"].(string)
La dernière version de Docopt renvoie Options un objet contenant des méthodes de conversion:
Host, err := arguments.String("<Host>")
port, err := arguments.String("<port>")
Host_port := Host + ":" + port
Vous n'avez pas besoin d'utiliser une assertion de type, mais utilisez simplement le spécificateur de format %v
avec Sprintf
:
hostAndPort := fmt.Sprintf("%v:%v", arguments["<Host>"], arguments["<port>"])
Pour développer ce que Peter a dit: Puisque vous cherchez à passer de l’interface {} à la chaîne, l’affirmation du type entraînera des maux de tête, car vous devez tenir compte de plusieurs types entrants. Vous devrez affirmer chaque type possible et vérifier qu'il s'agit bien 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 le type situé derrière l'interface sans un paquet de code supplémentaire de votre part.
Maintenant, j'ai été créé package pour la conversion d'interface en tout type de données ici le lien github et lien godoc https://github.com/mufti1/interconv
lien godoc https://godoc.org/github.com/mufti1/interconv/package
vous importez juste de godoc puis appelez la fonction