На основе примера JSON, появляется , что вы пытаетесь создать рекурсивную структуру JSON. Рекурсивные JSON (и рекурсивные структуры) очень полезны, но вы должны убедиться, что вы правильно их построили, иначе вы можете столкнуться с ситуациями, когда структура не может быть создана в памяти.
Давайте рассмотрим простой пример:
type example struct {
itemOne int64
subElement example
}
Когда программа начинает создавать структуру в памяти, она должна выяснить, насколько она должна быть большой. Этот процесс выглядит следующим образом:
- выяснить, насколько велик элемент itemOne.
- Добавьте 8 байтов в пространство выделения. (Итого: 8)
- выяснить, насколько велик подэлемент.
- выяснить, насколько велика subElement-itemOne
- Добавить 8 байтов в пространство выделения. (Всего: 16)
- выяснить, насколько велик subElement-subElement
- et c.
Этот процесс будет продолжаться вечно до тех пор, пока 1: не произойдет переполнение стека в программе, вычисляющей объем памяти, или 2: общий объем требуемой памяти слишком велик для программы.
In в случае Go эта ситуация фактически имеет встроенное обнаружение, поэтому второй шаг фактически никогда не выполняется. Например, возвращает ./prog.go:7:6: invalid recursive type example
.
Решением этой проблемы является создание структуры, в которой калькулятор знает точный размер всего, что он должен добавить в структуру. Для этого мы используем тот факт, что все структуры имеют общий размер указателя на их расположение в памяти.
type example struct {
itemOne int64
subElement *example
}
Добавление этой единственной звездочки делает рекурсивный процесс конечным.
- выясните, каков размер элемента itemOne.
- Добавьте 8 байтов в пространство выделения. (Всего: 8)
- выяснить, насколько велика подэлемент указатель .
- Добавление 8 байтов в пространство выделения (всего 16)
- Очистка и распределение 16 байтов.
Значения затем устанавливаются по умолчанию. Целые числа установлены в ноль и указывают на нулевое значение (также ноль). Передача одного из них в json unmarshal создаст именно ту структуру, которую вы ищете.
type sub struct {
Name string `json:"name"`
Desc string `json:"desc"`
Sub []*sub `json:"sub"`
}
полный пример (Спасибо chmike за большую часть тяжелой работы / форматирование для этого примера)
Если вы хотите еще немного покопаться в golang и указателях, в Интернете есть множество ресурсов, таких как официальная документация , которая содержит некоторую информацию, или geeksforgeeks , который немного более сфокусирован на примерах. Просто помните о golang автоматах c разыменование