为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕婉清6462132 2022-05-10 14:08:32
下面两种自定义类型的简化示例。“问题”包含“已保存问题”,“已保存问题”包含“问题”。错误: 1. SavedQuestion 声明中的非法循环 2. 无效的递归类型 Questiontype 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”中的“问题”作为指向“问题”的指针,错误就会消失......但是我不知道我是否应该或需要这样做,或者它是否真的可以作为代码还不够完整,无法运行测试...新的地鼠迷糊了...感谢您的任何意见。
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

您不能在另一个结构中递归地包含一个结构,原因很简单,即结构的大小和内存布局变得递归。的大小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元素,它将为零。


查看完整回答
反对 回复 2022-05-10
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信