Estoy usando docopt para analizar los argumentos de la línea de comandos. Esto funciona y da como resultado un mapa, como
map[<host>:www.google.de <port>:80 --help:false --version:false]
Ahora me gustaría concatenar el host
y el port
valor a una cadena con dos puntos entre los dos valores. Básicamente, algo como:
host := arguments["<host>"] + ":" + arguments["<port>"]
Desafortunadamente, esto no funciona, ya que recibo el mensaje de error:
operación no válida: argumentos [""] + ":" (tipos no coincidentes interfaz {} y cadena)
Entonces, obviamente, necesito convertir el valor que obtengo del mapa (que es solo interface{}
, por lo que puede ser cualquier cosa) en una cadena. Ahora mi pregunta es, ¿cómo hago eso?
Respuestas:
Debe agregar una afirmación de tipo
.(string)
. Es necesario porque el mapa es de tipomap[string]interface{}
:La última versión de Docopt devuelve el objeto Opts que tiene métodos para la conversión:
fuente
No es necesario utilizar una aserción de tipo, en su lugar, utilice el
%v
especificador de formato conSprintf
:fuente
Para ampliar lo que dijo Peter: ya que está buscando pasar de la interfaz {} a la cadena, la aserción de tipos le dará dolores de cabeza, ya que debe tener en cuenta varios tipos entrantes. Tendrá que afirmar cada tipo posible y verificar que sea ese tipo antes de usarlo.
El uso de fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) maneja automáticamente la conversión de la interfaz. Como sabe que el tipo de salida deseado es siempre una cadena, Sprintf manejará cualquier tipo que esté detrás de la interfaz sin un montón de código adicional en su nombre.
fuente