«неверный рекурсивный тип» и «недопустимый цикл в объявлении» - PullRequest
0 голосов
/ 27 января 2020

Сокращенный пример двух пользовательских типов ниже. «Вопрос» содержит «SavedQuestion», а «SavedQuestion» содержит «Вопрос».

Ошибки: 1. Недопустимый цикл в объявлении SavedQuestion 2. Недопустимый рекурсивный тип Вопрос

type Question struct {
    ID                    int           `json:"id"`
    Name                  string        `json:"name"`
    QueryText             string        `json:"query_text"`
    SavedQuestion         SavedQuestion `json:"saved_question"`
}

type SavedQuestion struct {
    ID                       int             `json:"id"`
    Index                    int             `json:"index"`
    Name                     string          `json:"name"`
    Packages                 PackageSpecList `json:"packages"`
    QueryText                string          `json:"query_text"`
    Question                 Question        `json:"question"`
}

I Я моделирую некоторые типы для использования сторонних API ... Объекты сторонних API моделируются таким образом. Кажется совершенно нормальным, что «SavedQuestion» - это отдельный тип, который по существу содержит «Вопрос» вместе с кучей других данных о нем ... Я могу видеть l oop с «Вопросом», также содержащим «SavedQuestion» «... но это то, что делает API. Как вы можете видеть из тегов json, я просто пытаюсь смоделировать, что именно отправляет API, чтобы я мог выполнить маршал / анмаршал и др. c ..

Как мне это сделать? Я могу сделать "Вопрос" в "SavedQuestion" указателем на "Вопрос" и ошибки go прочь ... однако я не знаю, нужно ли мне это делать или нужно ли это на самом деле поскольку код еще не завершен, чтобы запустить тест ...

Новый суслик сбит с толку ...

Спасибо за любой ввод.

1 Ответ

5 голосов
/ 27 января 2020

Вы не можете рекурсивно включать одну структуру в другую по той простой причине, что размер и структура памяти структуры становятся рекурсивными. Размер Question - это некоторые данные + размер (SavedQuestion), а размер SavedQuestion - это размер некоторых данных + размер Question ...

Однако, если вы используете указатели, проблема с размерами решена:

type Question struct {
    ID                    int           `json:"id"`
    Name                  string        `json:"name"`
    QueryText             string        `json:"query_text"`
    SavedQuestion         *SavedQuestion `json:"saved_question"`
}

Необходимо указать, когда ссылаться на question.SavedQuestion, это не ноль. Это будет хорошо работать для маршалинга / демаршалинга. Когда вы демаршируете, если JSON не имеет элемента saved_question, это будет ноль.

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