登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-12 14:32:31 492浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《“无效的递归类型”和“声明中的非法循环”》,这篇文章主要讲到golang等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

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

错误: 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”中的“问题”作为指向“问题”的指针,错误就会消失......但是我不知道我是否应该或需要这样做,或者它是否真的可以作为代码还不够完整,无法运行测试...

新的地鼠迷糊了...

感谢您的任何意见。

正确答案

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

本篇关于《“无效的递归类型”和“声明中的非法循环”》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表