Menggunakan Goldmark untuk melampirkan ChildNode dalam golang menyebabkan limpahan tindanan

PHPz
Lepaskan: 2024-02-08 20:42:11
ke hadapan
949 orang telah melayarinya

在 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
})
Salin selepas log masuk

Namun, apabila saya menjalankan ini, saya mendapat

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

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
})
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan