Die Verwendung von Goldmark zum Anhängen von ChildNode in Golang führt zu einem Stapelüberlauf

PHPz
Freigeben: 2024-02-08 20:42:11
nach vorne
947 Leute haben es durchsucht

在 golang 中使用 Goldmark 附加 ChildNode 会导致堆栈溢出

Frageninhalt

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
})
Nach dem Login kopieren

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
Nach dem Login kopieren

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.


Richtige Antwort


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
})
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage