преобразовать все значения карты в строку в go - PullRequest
0 голосов
/ 09 мая 2020

Я использую приложение, написанное на go, которое принимает список ключей и извлекает значения из данных, если этот ключ существует в данных.

Однако эта функция принимает только строковые значения - и, к сожалению, мои данные имеют как массивы, так и числа в качестве значений (это не может быть изменено, оно исходит из Azure OID C логина)

Поэтому вместо того, чтобы жаловаться, я подумал, что засучу рукава и попробую и исправлю это сам (никогда раньше не писал ни одной строчки "go")

итак, это исходная функция

func extractMetadata(logger log.Logger, allClaims map[string]interface{}, claimMappings map[string]string) (map[string]string, error) {
    metadata := make(map[string]string)
    for source, target := range claimMappings {
        if value := getClaim(logger, allClaims, source); value != nil {
            strValue, ok := value.(string)
            if !ok {
                return nil, fmt.Errorf("error converting claim '%s' to string", source)
            }

            metadata[target] = strValue
        }
    }
    return metadata, nil
}

Я считаю, что это строка

strValue, ok := value.(string)

, поскольку именно здесь я получаю сообщение об ошибке.

Если бы я изменил это на

strValue, ok := fmt.Sprintf("%v",value), было бы это (a ) работать и (б) быть в безопасности? ..

(fmt уже импортирован кодом)

Доступны ли более элегантные решения в go?

Ответы [ 2 ]

1 голос
/ 09 мая 2020

value.(string) выполняет утверждение типа не преобразование типа Проверяет, является ли value строкой, и возвращает то же самое вместе с логическим флагом.

Чтобы преобразовать интерфейс в строку, вы можете отформатировать его, используя Sprintf, которое вернет одно строковое значение,

strValue := fmt.Sprint("%v", value)

Безопасность будет зависеть от вашего приложения. Если позже вы сможете проанализировать данные и интерпретировать числа и массивы так, как они есть, все будет в порядке.

Поскольку это похоже на хранилище метаданных для простой информации, форматирование строк должно быть в порядке.

1 голос
/ 09 мая 2020

fmt.Sprintf("%v",value) безопасно форматирует любое значение в виде строки. Более простой вызов - fmt.Sprint(value). Оба вызова используют формат по умолчанию для типа, который может быть или не соответствовать желаемому формату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...