gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:03 24 4
gpt4 key购买 nike

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)
}
}

在上面的函数中,如您所见,我将一个 slice 指针传递给 getAllCertainDivs 函数。在某一点上,HtmlTag 指针被插入 slice matchingDivs。在 append 之后,我检查 matchingDiv slice 的内容,然后让函数再次递归调用自身。然后在 append 所在的 if 下方,该函数递归调用自身一次。然后我在 fmt.Println(htmlTag.Class) 处停止并再次检查 matchingDivs slice 的内容。而且内容和以前完全不一样。

只有一个append,内容怎么变?每次我将它传递给下一个递归调用时,golang 是否使用相同的 HtmlTag 指针?

最佳答案

tag 变量在循环开始时声明一次,tag 的值在每次迭代时被覆盖。这与您在 FAQ 中看到的问题相同与:"What happens with closures running as goroutines?"

您可以在每次迭代期间声明一个新变量以获得函数调用的唯一指针:

for _, tag := range htmlTag.ChildTags {
tag := tag
getAllCertainDivs(className, idName, &tag, matchingDivs)
}

或者你可以省略范围值,直接使用索引:

for i := range htmlTag.ChildTags {
getAllCertainDivs(className, idName, &htmlTag.ChildTags[i], matchingDivs)
}

关于golang - 递归函数运行期间 slice 中指针的内容发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35440619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com