как заставить интерфейсный объект выполнить какое-либо действие по индексированию? - PullRequest
0 голосов
/ 03 мая 2018

Источник данных журнала выглядит так:

{ "LogtypeA": { "содержание": "listen_logs": [{ "useful_key1": знач1, "useful_key2": знач2}, { "useful_key1": знач1}]}}

Тогда я использую simplejson для их анализа. Значение listen_logs - это фрагмент, который содержит хотя бы одну карту. Код:

for _, v := range js.Get("LogTypeA").Get("content").Get("listen_logs").MustArray() {
        _obj := reflect.ValueOf(v)
        fmt.Println(_obj.Kind())
    }

Если я заменим MustArray() на Array(), он сообщит о неправильных объявлениях переменных и констант. Используя модуль отражения, я обнаружу, что _obj.Kind() - это карта, но я не могу использовать какой-либо метод индексации для получения значений из v, например:

_val1 := v["useful_key1"]

или

for i, v := range v {...}

Поскольку тип interface{} не поддерживает индексирование. Итак, как мне извлечь эти полезные ключи X из этих журналов?

1 Ответ

0 голосов
/ 03 мая 2018

Вам необходимо выполнить утверждение типа на получившейся карте:

new_v := v.(map[string]interface{})
_val1 := new_v["useful_key1"]

Или, если вы не уверены, что это будет карта:

new_v, ok := v.(map[string]interface{})
if ok {
    // it was a map from strings to something
    _val1 := new_v["useful_key1"]
} else {
    print("Could not interpret v as a map.")
}

Поскольку изначально это пустой интерфейс, т. Е. interface{}, это означает, что он может быть любого типа. Итак, вам нужно указать, что вы хотите рассматривать его как карту, прежде чем пытаться получить доступ к элементам.

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