Ich verwende Goldmark in Go und bin neu darin, daher bin ich mir nicht sicher, ob ich das richtig mache. Ich habe die Dokumentation gelesen, bin aber etwas verwirrt darüber, warum das passiert.
Ich habe eine Markdown-Datei geparst und ast.walk verwendet, um durch die ast zu gehen.
Mein Ziel ist es, eine Unterliste unter dem Listenelement einzufügen.
ast.walk(doc, func(n ast.node, entering bool) (ast.walkstatus, error) { if entering { if n.kind() == ast.kindlistitem { sublist := ast.newlist(0) sublistitem := ast.newlistitem(0) sublist.appendchild(sublist, sublistitem) leaf := ast.newstring([]byte("hello")) sublistitem.appendchild(sublistitem, leaf) n.appendchild(n, sublist) } } return ast.walkcontinue, nil })
Wenn ich das jedoch ausführe, erhalte ich
runtime: goroutine stack exceeds 1000000000-byte limit runtime: sp=0xc04f9803c8 stack=[0xc04f980000, 0xc06f980000] fatal error: stack overflow
Ich denke, das wird durch das Hinzufügen eines neuen Knotens und den Zugriff auf diesen Knoten in der nächsten Iteration verursacht. Ich bin mir jedoch nicht ganz sicher, wie ich neue Knoten überspringen soll.
Sie haben Recht, der Stapelüberlauffehler wird durch den Zugriff eines neuen Knotens verursacht.
Um dieses Problem zu lösen, können Sie die hinzugefügten Knoten aufzeichnen und in der Walk-Funktion überspringen.
// for recording the added nodes added := make(map[*ast.List]bool) ast.Walk(doc, func(n ast.Node, entering bool) (ast.WalkStatus, error) { if entering { if n.Kind() == ast.KindList { if _, ok := added[n.(*ast.List)]; ok { // skip the added node return ast.WalkSkipChildren, nil } } if n.Kind() == ast.KindListItem { subList := ast.NewList(0) subListItem := ast.NewListItem(0) subList.AppendChild(subList, subListItem) leaf := ast.NewString([]byte("Hello")) subListItem.AppendChild(subListItem, leaf) n.AppendChild(n, subList) // record the added node added[subList] = true } } return ast.WalkContinue, nil })
Das obige ist der detaillierte Inhalt vonDie Verwendung von Goldmark zum Anhängen von ChildNode in Golang führt zu einem Stapelüberlauf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!