GoLang: вложенные свойства для структур с неизвестными именами свойств? - PullRequest
10 голосов
/ 21 марта 2012

Я использую json, чтобы получить некоторые значения в структуре из внешнего источника. Использование UnMarshal для помещения значений в структуру.

У меня есть такая структура, что UnMarshal помещает значения в:

type Frame struct{
Type string
Value map[string]interface{}
}
var data Frame

После UnMarshal я могу получить доступ к типу: data.Type

но если я попытаюсь сделать что-то вроде:

if data.Type == 'image'{
    fmt.Println(fmt.Sprintf("%s", data.Value.Imagedata))
}

Компилятор жалуется на отсутствие такого значения data.Value.Imagedata

Итак, мой вопрос: как я могу ссылаться на свойства в GoLang в коде, который, как я знаю, будет там в зависимости от какого-то условия?

Выполнение этой работы:

type Image struct{
Filename string
}

type Frame struct{
Type string
Value map[string]interface{}
}

Но это не очень гибко, так как я буду получать разные Value с

1 Ответ

15 голосов
/ 21 марта 2012

UnMarshal сделает все возможное, чтобы разместить данные там, где они лучше всего соответствуют вашей структуре. Технически ваш первый пример будет работать, но вы пытаетесь получить доступ к полю Value с точечной нотацией, даже если вы объявили его картой:

Это должно дать вам некоторую форму вывода:

if data.Type == 'image'{
    fmt.Printf("%v\n", data.Value["Imagedata"])
}

... учитывая, что "Imagedata" была ключом в json.

У вас есть возможность определить структуру настолько глубоко, насколько вы хотите или ожидаете структуру, или использовать интерфейс {}, а затем делать утверждения типа для значений. Если поле «Значение» является картой, вы всегда будете иметь доступ к ключам, таким как Value[key], а затем значением этой карты будет интерфейс {}, который вы можете ввести assert, например, Value[key].(float64)

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

Вложенный (с анонимной структурой)

type Frame struct {
    Type    string
    Value struct {
        Imagedata string `json:"image_data"`
    } 
}

Отдельные структуры

type Frame struct {
    Type    string
    Value   value 
}

type value struct {
    Imagedata string `json:"image_data"`
}

Я все еще учусь иди сам, так что это степень моего текущего понимания: -)

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