func getAllCertainDivs(className string, idName string, htmlTag *HtmlTag, matchingDivs *[]*HtmlTag) { fmt.Println(htmlTag.Class) if htmlTag.XMLName.Local == "div" { if htmlTag.Class == className && htmlTag.Id == idName { *matchingDivs = append(*matchingDivs, htmlTag) } } for _, tag := range htmlTag.ChildTags { getAllCertainDivs(className, idName, &tag, matchingDivs) }}在上面的函数中,如您所见,我将切片的指针传递给getAllCertainDivs函数。在某一点,一个HtmlTag指针被推入切片matchingDivs。在append我检查了matchingDiv slice 的内容之后,在让函数再次递归调用自己之前。然后在 if where 的下方append,该函数递归调用自身一次。我停下fmt.Println(htmlTag.Class)来matchingDivs再次检查slice的内容。而且内容和之前完全不一样。只有一个append,内容怎么改?是否golang使用相同的HtmlTag指针,每次我将它传递给下一个递归调用?
1 回答
繁花如伊
TA贡献2012条经验 获得超12个赞
的tag变量声明一旦在循环的开始,和的值tag被重写在每次迭代。这与您在常见问题解答中看到的问题相同:“作为 goroutine 运行的闭包会发生什么?”
您可以在每次迭代期间声明一个新变量以获得函数调用的唯一指针:
for _, tag := range htmlTag.ChildTags {
tag := tag
getAllCertainDivs(className, idName, &tag, matchingDivs)
}
或者,您可以省略范围值,并直接使用索引:
for i := range htmlTag.ChildTags {
getAllCertainDivs(className, idName, &htmlTag.ChildTags[i], matchingDivs)
}
- 1 回答
- 0 关注
- 216 浏览
添加回答
举报
0/150
提交
取消
