Добавление значения к структуре struct в Golang возвращает неверный адрес памяти - PullRequest
0 голосов
/ 27 июня 2019

У меня есть структура еды, которая «добавляет» другую структуру, за исключением того, что я хочу добавить другую структуру «едыКомпоненты».

type mealMain struct {
    *model.Meal
    Components []mealComponent `json:"components"`
}

type mealComponent struct {
    *model.MealComponent
}

Где * модель. Еда выглядит следующим образом

type Meal struct {
    ID               int64     `json:"id"`
}

То, что я хочу, - это, в основном, структура "mealMain", которая будет действовать как структура "Meal", чтобы я мог присваивать значения и каким-то образом добавлять еду в качестве дочернего элемента (или, возможно, это не очень хорошая идея? Я открыт для предложений)

Однако, когда я делаю что-то подобное

var meal mealMain
meal.ID = 1

Выдает runtime error: invalid memory address or nil pointer dereference при приеме пищи. ID.

Но если я сделаю это так:

type mealMain struct {
    MealMain *model.Meal `json:"meal_main"`
    Components []mealComponent `json:"components"`
}

Затем назначьте это так:

var meal mealMain
meal.mealMain.ID = 1

Это работает правильно, но у меня есть возвращение JSON еще глубже, как это:

{
    "MealModel": {
        "id": 1
    }
}

Я хочу вот что:

{
    "id": 1
}

Примечание: я хочу не менять модель.

1 Ответ

2 голосов
/ 27 июня 2019

Если вы не хотите менять модель:

    var meal = mealMain{
        Meal: &Meal{},
    }
    meal.ID = 1

Дело в том, что в следующей структуре *Meal имеет значение nil, если вы не инициализируете его.

type mealMain struct {
    *Meal
    Components []mealComponent `json:"components"`
}

Вероятно, я бы создал функцию, чтобы никогда больше не беспокоиться о правильной инициализации:

func newMealMain() mealMain {
    return mealMain{
        Meal: &Meal{},
    }
}

Тогда ваш код будет:

    var meal = newMealMain()
    meal.ID = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...