我有以下结构
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中有我无法发现的明显错误。
答案 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
}