问题

当我在代码中使用NewChild()函数,然后将“Report”结构编组为JSON时,出现堆栈溢出(goroutine堆栈超过1000000000字节的限制)

经过研究,我发现它应该使用无限递归来做一些事情,但是我不知道为什么我的代码应该具有无限递归。

代码

type Report struct{
    TestSuites []ReportElement
    Tests int
    Success int
    Failed int
    Root *ReportElement
    CurrentElement *ReportElement `json:"-"`
}

type ReportElement struct{
    Success bool
    Time bool
    LogStorage []string
    Childs []ReportElement
    Parent *ReportElement
}

func (r *Report) NewChild(){
    newElem := ReportElement{}
    newElem.Parent = r.CurrentElement
    newElem.Childs = make([]ReportElement,0)

    newChilds := append(r.CurrentElement.Childs,newElem)
    r.CurrentElement.Childs = newChilds

    r.CurrentElement = &newElem
}


func TestReporterStackOverflow(t *testing.T) {
    report := NewReport()
    report.NewChild()

    jsonReport,err := json.MarshalIndent(report,""," ")
    if err != nil{
        t.Fatal(err)
    }

    t.Log(jsonReport)
}

想法

实际上,我不确定它是否必须对我的代码做些什么,因为stacktrace会导致“/usr/local/go/src/encoding/json/encode.go”。

非常感谢你的帮助!

最佳答案

由于父/子指针,您有多个无限循环。每个父母都指向其子女,子女又指向其父母。请注意,反序列化时,指向同一对象的多个指针最终将成为多个单独的对象,这可能不是您想要的。

10-08 00:18