tutorial descargar go

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?



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.