使用递归函数迭代递归结构

时间:2019-06-30 17:27:33

标签: go

我有以下结构

    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,这是因为在子页面上可以找到子子。

由于某些未知原因,findURLItemRecursive是越野车。

问题是我不能在第二级附加更多UrlItem

我的意思是我可以创建Root项目,为Urls项目创建Root切片,但是之后我无法创建嵌套切片。所以我不能超过第一级。

我想知道函数findURLItemRecursive是否在Go中有我无法发现的明显错误。

1 个答案:

答案 0 :(得分:0)

我认为这应该对您有用。

    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
    }