Я использую 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{}
:Последняя версия Docopt возвращает объект Opts , у которого есть методы для преобразования:
источник
Вам не нужно использовать утверждение типа, вместо этого просто используйте
%v
спецификатор формата сSprintf
:источник
Чтобы расширить то, что сказал Питер: поскольку вы хотите перейти от интерфейса {} к строке, утверждение типа приведет к головной боли, поскольку вам нужно учитывать несколько входящих типов. Вам нужно будет подтвердить каждый возможный тип и убедиться, что он именно тот тип, прежде чем использовать его.
Использование fmt.Sprintf ( https://golang.org/pkg/fmt/#Sprintf ) автоматически обрабатывает преобразование интерфейса. Поскольку вы знаете, что желаемый тип вывода всегда является строкой, Sprintf обработает любой тип, стоящий за интерфейсом, без кучи дополнительного кода от вашего имени.
источник