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