Ответ 1
Вам нужно добавить утверждение типа .(string)
. Это необходимо, потому что карта имеет тип map[string]interface{}
:
host := arguments["<host>"].(string) + ":" + arguments["<port>"].(string)
Я использую docopt для анализа аргументов командной строки. Это работает, и в результате получается карта, например
map[<host>:www.google.de <port>:80 --help:false --version:false]
Теперь я хотел бы объединить значения host
и port
в строку с двоеточием между двумя значениями. В основном, что-то вроде:
host := arguments["<host>"] + ":" + arguments["<port>"]
К сожалению, это не работает, поскольку я получаю сообщение об ошибке:
Неверная операция: arguments [ "] +":" (интерфейс несовпадающих типов {} и строка)
Поэтому, очевидно, мне нужно преобразовать значение, которое я получаю из карты (это просто interface{}
, так что это может быть что угодно) для строки. Теперь мой вопрос: как мне это сделать?
Вам нужно добавить утверждение типа .(string)
. Это необходимо, потому что карта имеет тип map[string]interface{}
:
host := arguments["<host>"].(string) + ":" + arguments["<port>"].(string)
Вам не нужно использовать утверждение типа, вместо этого просто используйте спецификатор формата %v
с Sprintf
:
hostAndPort := fmt.Sprintf("%v:%v", arguments["<host>"], arguments["<port>"])
Чтобы расширить то, что сказал Петр: Поскольку вы хотите перейти от интерфейса {} к строке, тип assertion приведет к головным болям, поскольку вам нужно учитывать несколько входящих типов. Вам нужно будет утверждать каждый тип и проверить его тип перед его использованием.
Использование fmt.Sprintf(https://golang.org/pkg/fmt/#Sprintf) автоматически обрабатывает преобразование интерфейса. Поскольку вы знаете, что ваш желаемый тип вывода всегда является строкой, Sprintf будет обрабатывать любой тип за интерфейсом без кучи дополнительного кода от вашего имени.