“无效的递归类型”和“声明中的非法循环”

下面两种自定义类型的简化示例。“问题”包含“已保存问题”,“已保存问题”包含“问题”。


错误: 1. SavedQuestion 声明中的非法循环 2. 无效的递归类型 Question


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"`

}

我正在对某些类型进行建模以使用第 3 方 API……第 3 方 API 的对象以这种方式建模。“SavedQuestion”是一个单独的类型,它基本上包含一个“问题”以及一堆关于它的其他数据,这似乎是完全正常的......我可以看到一个“问题”的循环也包含一个“SavedQuestion”.. . 但这就是 API 的作用。正如您从 json 标签中看到的那样,我只是想准确地对 API 发送的内容进行建模,以便我可以编组/解组等。


我该如何进行这项工作?我可以将“SavedQuestion”中的“问题”作为指向“问题”的指针,错误就会消失......但是我不知道我是否应该或需要这样做,或者它是否真的可以作为代码还不够完整,无法运行测试...


新的地鼠迷糊了...


感谢您的任何意见。


慕婉清6462132
浏览 111回答 1
1回答

忽然笑

您不能在另一个结构中递归地包含一个结构,原因很简单,即结构的大小和内存布局变得递归。的大小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,它不是 nil。这对于编组/解组非常有效。当你解组时,如果 JSON 没有saved_question元素,它将为零。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go