Подтвердить что ты не робот

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

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

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

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

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

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

Неверная операция: arguments [ "] +":" (интерфейс несовпадающих типов {} и строка)

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

4b9b3361

Ответ 1

Вам нужно добавить утверждение типа .(string). Это необходимо, потому что карта имеет тип map[string]interface{}:

host := arguments["<host>"].(string) + ":" + arguments["<port>"].(string)

Ответ 2

Вам не нужно использовать утверждение типа, вместо этого просто используйте спецификатор формата %v с Sprintf:

hostAndPort := fmt.Sprintf("%v:%v", arguments["<host>"], arguments["<port>"])

Ответ 3

Чтобы расширить то, что сказал Петр: Поскольку вы хотите перейти от интерфейса {} к строке, тип assertion приведет к головным болям, поскольку вам нужно учитывать несколько входящих типов. Вам нужно будет утверждать каждый тип и проверить его тип перед его использованием.

Использование fmt.Sprintf(https://golang.org/pkg/fmt/#Sprintf) автоматически обрабатывает преобразование интерфейса. Поскольку вы знаете, что ваш желаемый тип вывода всегда является строкой, Sprintf будет обрабатывать любой тип за интерфейсом без кучи дополнительного кода от вашего имени.