Estou usando docopt para analisar argumentos de linha de comando. Isso funciona e resulta em um mapa, como
map[<host>:www.google.de <port>:80 --help:false --version:false]
Agora, eu gostaria de concatenar o host
e o port
valor em uma string com dois pontos entre os dois valores. Basicamente, algo como:
host := arguments["<host>"] + ":" + arguments["<port>"]
Infelizmente, isso não funciona, pois recebo a mensagem de erro:
operação inválida: argumentos [""] + ":" (interface de tipos incompatíveis {} e string)
Obviamente, preciso converter o valor que obtenho do mapa (que é justo interface{}
, então pode ser qualquer coisa) em uma string. Agora, minha pergunta é: como faço isso?
Respostas:
Você precisa adicionar a asserção de tipo
.(string)
. É necessário porque o mapa é do tipomap[string]interface{}
:A última versão do Docopt retorna o objeto Opts que possui métodos de conversão:
fonte
Você não precisa usar uma asserção de tipo, em vez disso, apenas use o
%v
especificador de formato comSprintf
:fonte
Para expandir o que Peter disse: Já que você está procurando ir da interface {} para a string, a asserção de tipo levará a dores de cabeça, pois você precisa levar em conta vários tipos de entrada. Você terá que declarar cada tipo possível e verificar se é aquele tipo antes de usá-lo.
Usar fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) controla automaticamente a conversão da interface. Como você sabe que o tipo de saída desejado é sempre uma string, Sprintf irá lidar com qualquer tipo que esteja por trás da interface sem um monte de código extra em seu nome.
fonte