为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
胡子哥哥 2023-06-26 17:48:27
我有以下结构    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有任何我无法发现的明显错误。
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

我认为这应该对你有用。


    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

    }


查看完整回答
反对 回复 2023-06-26
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信