web-dev-qa-db-fra.com

Comment convertir l'interface {} en chaîne?

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?

85
Golo Roden

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
122
Grzegorz Żur

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>"])
74
Peter Stace

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.

13
justitan

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

0
Mufti