Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan Goldmark untuk melampirkan ChildNode dalam golang menyebabkan limpahan tindanan

Menggunakan Goldmark untuk melampirkan ChildNode dalam golang menyebabkan limpahan tindanan

PHPz
PHPzke hadapan
2024-02-08 20:42:11926semak imbas

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

Kandungan soalan

Saya telah menggunakan goldmark dalam go dan saya baru menggunakannya jadi saya tidak pasti sama ada saya melakukan ini dengan betul. Saya telah membaca dokumentasi, tetapi saya sedikit keliru mengapa ini berlaku.

Saya telah menghuraikan fail markdown dan menggunakan ast.walk untuk berjalan melalui ast.

Matlamat saya adalah untuk menyuntik subsenarai di bawah item senarai.

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

Namun, apabila saya menjalankan ini, saya mendapat

runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0xc04f9803c8 stack=[0xc04f980000, 0xc06f980000]
fatal error: stack overflow

Saya rasa ini disebabkan oleh menambah nod baharu dan mengakses nod itu dalam lelaran seterusnya. Tetapi saya tidak pasti sepenuhnya cara melangkau nod baharu.


Jawapan betul


Anda betul, ralat limpahan tindanan disebabkan oleh akses nod baharu.

Untuk menyelesaikan masalah ini, anda boleh merakam nod yang ditambahkan dan melangkaunya dalam fungsi berjalan.

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

Atas ialah kandungan terperinci Menggunakan Goldmark untuk melampirkan ChildNode dalam golang menyebabkan limpahan tindanan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam