问题
当我在代码中使用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”。
非常感谢你的帮助!
最佳答案
由于父/子指针,您有多个无限循环。每个父母都指向其子女,子女又指向其父母。请注意,反序列化时,指向同一对象的多个指针最终将成为多个单独的对象,这可能不是您想要的。