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

我有以下结构


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


由于某些未知的原因findURLItemRecursive是有缺陷的。


问题是我无法UrlItem在第二级附加更多。


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


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


胡子哥哥
浏览 160回答 1
1回答

守着星空守着你

我认为这应该对你有用。    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    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go