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

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指针,每次我将它传递给下一个递归调用?


潇湘沐
浏览 217回答 1
1回答

繁花如伊

的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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go