go - descargar - ¿Cómo convertir la interfaz{} a cadena?
descargar biopython (4)
Estoy usando docopt para analizar argumentos de 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 valor del
port
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 [""] + ":" (interfaz de tipos no coincidentes {} y cadena)
Obviamente, necesito convertir el valor que obtengo del mapa (que es solo la
interface{}
, por lo que puede ser cualquier cosa) en una cadena.
Ahora mi pregunta es, ¿cómo hago eso?
Ahora se creó el paquete para convertir la interfaz a cualquier tipo de datos aquí, el enlace github y el enlace godoc https://github.com/mufti1/interconv
enlace de godoc https://godoc.org/github.com/mufti1/interconv/package
simplemente importa desde godoc y luego llama a la función
Debe agregar la
golang.org/ref/spec#Type_assertions
.(string)
.
Es necesario porque el mapa es del tipo
map[string]interface{}
:
host := arguments["<host>"].(string) + ":" + arguments["<port>"].(string)
La última versión de Docopt devuelve el objeto Opts que tiene métodos para la conversión:
host, err := arguments.String("<host>")
port, err := arguments.String("<port>")
host_port := host + ":" + port
No necesita usar una aserción de tipo, solo use el especificador de formato
%v
con
Sprintf
:
hostAndPort := fmt.Sprintf("%v:%v", arguments["<host>"], arguments["<port>"])
Para ampliar lo que dijo Peter: Dado que está buscando pasar de la interfaz {} a la cadena, la aserción de tipo generará dolores de cabeza ya que debe tener en cuenta los múltiples 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 su tipo de salida deseado es siempre una cadena, Sprintf manejará cualquier tipo detrás de la interfaz sin un montón de código adicional en su nombre.