Итерация по рекурсивной структуре с функцией рекурсии - PullRequest
0 голосов
/ 30 июня 2019

У меня есть следующая структура

    type Sitemap struct {
        XMLName        xml.Name `xml:"urlset"`
        Namespace      string   `xml:"xmlns,attr"`
        Schema         string   `xml:"xmlns:xsi,attr"`
        SchemaLocation string   `xml:"xsi:schemaLocation,attr"`
        Root           *URLItem
    }

    type URLItem struct {
        XMLName xml.Name `xml:"url"`
        Loc     string   `xml:"loc"`
        LastMod string   `xml:"lastmod,omitempty"`
        Urls    []*URLItem
    }

    func (s *Sitemap) AddURL(key string, url string) {
        node, found := findURLItemRecursive(s.Root, key)
        if found {
            node.Urls = append(node.Urls, &URLItem{Loc: url})
        }
    }


    func findURLItemRecursive(urlItem *URLItem, key string) (*URLItem, bool) {
        if urlItem.Loc == key {
            return urlItem, true
        }

        for _, urlItem := range urlItem.Urls {
            return findURLItemRecursive(urlItem, key)
        }

        return nil, false
    }

, где key - это родительский URL-адрес, а url - это дочерний URL-адрес, связанный с родительским URL-адресом, из-за того, что в нем найдены дочерние элементы.страница родителя.

По неизвестным причинам findURLItemRecursive глючит.

Проблема в том, что я не могу прикрепить больше UrlItem (s) на втором уровне.

Я имею в виду, я могу создать элемент Root, создающий фрагменты Urls дляэлемент Root, но тогда я не могу создать вложенные фрагменты.Так что я не могу пройти больше, чем первый уровень.

Мне интересно, есть ли в функции findURLItemRecursive какие-либо явные ошибки в Go, которые я не могу обнаружить.

1 Ответ

0 голосов
/ 30 июня 2019

Я думаю, это должно сработать для вас.

    type Sitemap struct {
        XMLName        xml.Name `xml:"urlset"`
        Namespace      string   `xml:"xmlns,attr"`
        Schema         string   `xml:"xmlns:xsi,attr"`
        SchemaLocation string   `xml:"xsi:schemaLocation,attr"`
        Root           *URLItem
    }

    type URLItem struct {
        XMLName xml.Name `xml:"url"`
        Loc     string   `xml:"loc"`
        LastMod string   `xml:"lastmod,omitempty"`
        Urls    []*URLItem
    }

    func (s *Sitemap) AddURL(key string, url string) {
        node, found := findURLItemRecursive(s.Root, key)
        if found {
            node.Urls = append(node.Urls, &URLItem{Loc: url})
        }
    }


    func findURLItemRecursive(urlItem *URLItem, key string) (*URLItem, bool) {
        if urlItem.Loc == key {
            return urlItem, true
        }

        for _, urlItem := range urlItem.Urls {
            item, found := findURLItemRecursive(urlItem, key)
            if found {
                return item, found
            }
        }

        return nil, false
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...