在Golang中将值追加到struct的struct会返回无效的内存地址

时间:2019-06-27 11:26:35

标签: go struct

除了要添加另一个结构“ mealComponents”外,我有一个膳食结构“附加”了另一个结构。

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

type mealComponent struct {
    *model.MealComponent
}

其中* model.Meal如下

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

我想要的基本上是让“ mealMain”结构像“ Meal”结构一样工作,以便我可以分配值并以某种方式将meatComponent追加为子级(或者这不是一个好主意?我愿意接受建议)

但是当我做这样的事情

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 个答案:

答案 0 :(得分:2)

如果您不想更改模型:

    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