Heim  >  Artikel  >  Backend-Entwicklung  >  Die Verwendung von Goldmark zum Anhängen von ChildNode in Golang führt zu einem Stapelüberlauf

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

PHPz
PHPznach vorne
2024-02-08 20:42:11942Durchsuche

在 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
})

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.


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
})

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen