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

golang - 在递归函数运行期间切片中指针的内容发生变化

golang - 在递归函数运行期间切片中指针的内容发生变化

Go
潇湘沐 2021-12-13 18:42:50
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)

}


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号