Как преобразовать интерфейс{} в строку?


я использую docopt для разбора аргументов командной строки. Это работает, и это приводит к карте, такой как

map[<host>:www.google.de <port>:80 --help:false --version:false]

теперь я хотел бы объединить host и port значение для строки с двоеточием между двумя значениями. В основном, что-то вроде:

host := arguments["<host>"] + ":" + arguments["<port>"]

к сожалению, это не работает, как я получаю сообщение об ошибке:

недопустимая операция: аргументы[""] + ":" (несоответствие типов интерфейса {} и строка)

поэтому очевидно, что мне нужно преобразовать значение, которое я получаю от карты (которая просто interface{}, так что это может быть что угодно) в строку. Теперь мой вопрос, как мне это сделать?

3 58

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 будет обрабатывать что за интерфейс без кучи дополнительного кода от вашего имени.