Rumah > Artikel > pembangunan bahagian belakang > Menggunakan Goldmark untuk melampirkan ChildNode dalam golang menyebabkan limpahan tindanan
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.
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!