问题
当我在我的代码中使用NewChild()函数时,然后编组"报告"结构到JSON我得到一个Stack Overflow(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)
}
观
实际上我不确定是否必须对我的代码执行某些操作,因为堆栈跟踪会导致" /usr/local/go/src/encoding/json/encode.go"。
非常感谢你的帮助!
答案 0 :(得分:1)
由于父/子指针,您有多个无限循环。每个父母都指向其子女,这些孩子指向他们的父母。请注意,在反序列化时,指向同一对象的多个指针最终将成为多个单独的对象,这可能不是您想要的。