Как вернуть значение ключа карты типа пустого интерфейса - PullRequest
0 голосов
/ 16 апреля 2020

Я взял переменную типа var u = make(map[string]interface{}), что означает, что ключ может содержать строку / int или другую карту.

Когда я делаю следующее, это выдает ошибку cannot use v (type interface {}) as type string in return argument: need type assertion, которая выглядит очевидной как обобщенная c карта понятия не имеет, что она должна искать. Как я могу решить проблему? Код приведен ниже (ОБРАТИТЕ ВНИМАНИЕ, что в настоящее время карта полностью пуста)

var u = make(map[string]interface{})

// Get function retrieves the value of the given key. If failed, it returns error.
func Get(k string) (string, error) {
    v, found := u[k]
    println(reflect.Type(v))
    if found {
        v = u[k]
        return v, nil
    }
    return v, errors.New(-1)
}

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Я не уверен, какой у тебя вопрос. Но вы получаете эту ошибку, потому что вы пытаетесь вернуть interface{} как конкретный тип string. Если вы хотите вернуть строку и уверены, что значением карты всегда является строка (то почему вы используете map[string]interface{} вместо map[string]string?), Вы можете получить базовый тип интерфейса, используя утверждение типа:

s, ok := v.(string)
2 голосов
/ 16 апреля 2020

v, found := u[k] здесь v равно interface{} тип

Но тип возвращаемой вами функции (строка, ноль), куда вы возвращаете (v, ноль) или (интерфейс {}, ноль).

interface{} не может автоматически преобразовываться в строку, требуется утверждение типа.

data, ok := v.(string)

Вы также можете вернуть interface{}, и потребитель может решить, какой тип будет преобразован.

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