当前位置: 首页 > 面试题库 >

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

左丘成天
2023-03-14
问题内容
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切片的内容。然后在if所在的位置append下,该函数递归调用一次。然后我停在fmt.Println(htmlTag.Class)matchingDivs再次检查切片的内容。而且内容与以前完全不同。

只有一种append,内容如何改变?每次我将其传递到下一个递归调用时,是否golang使用相同的HtmlTag指针?


问题答案:

tag变量在循环开始时声明一次,tag每次迭代都会覆盖的值。这是与在FAQ中看到的相同问题:“以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)
}


 类似资料:
  • 值得注意点的是切片的本质就是一个指针指向数组,所以指向切片的指针是一个二级指针 package main import "fmt" func main() { // 1.定义一个切片 var sce[]int = []int{1, 3, 5} // 2.打印切片的地址 // 切片变量中保存的地址, 也就是指向的那个数组的地址 sce = 0xc0420620a0 f

  • 问题内容: 我有以下代码: 但是我想将一个指向字节切片的指针传递给另一个函数,并在那里切片,所以类似: 它给我一个错误,我不能在函数参数中使用type 作为类型,并且不能对type进行切片。怎么了?默认情况下切片不是通过引用传递的吗?我试图在没有指针的情况下执行此操作,但是它不起作用- 正在复制数组。我怎样才能做到这一点? 问题答案: 该错误来自您尚未发布的拼写错误(您尝试传递一个切片而不是指向的

  • 问题内容: 从切片创建切片的行为是什么?当您像这样定义切片时: 您想要这样修改切片: 它实际上可以“扩展”您的切片。哪个无效: 因此,在这种情况下,当您创建新的切片时,您将无法“保留”前两个元素。即使基础数组未更改,也无法更改指向该数组开头的指针,对吗?这是为什么? 问题答案: 正如@JimB在注释中指出的,这是由于slice在Go中的功能。 基本上,切片标头是一个包含3个元素的结构:一个指向第一

  • 问题内容: 背景:使用cgo从Golang调用C函数。 我想使用具有以下签名的C函数:。它会修改的数据和,这就是为什么它使用指针,它们的原因。的值是的长度;是一个字符串数组;返回值只是一个(布尔)指示符,用于指示是否存在错误。 在golang中,我可以使用来成功传递和修改。通过使用。示例代码如下: 如您所见,C函数当前为,但我想要的是。 这就是说:我真正想要的是在C中启用对字符串数组的修改(例如,

  • 问题内容: 我有一个要使用函数更改的切片(例如,我想删除第一个元素)。我以为可以使用指针,但仍然无法为其编制索引。我究竟做错了什么? 游乐场链接: 问题答案: 您需要使用。 或通常更像偶像的另一种方法:

  • 问题内容: 当尝试在切片指针上移动时,我一直收到此错误。 我究竟做错了什么? 这是结构: 这是Class结构: 问题答案: 您假设指向切片的指针将在迭代时自动取消引用。 事实并非如此,没有理由,因为切片已经是一种指针,从而使指向切片的指针完全无用。 从有效出发: 如果函数采用slice参数,则对slice元素所做的更改将对调用者可见,这类似于将指针传递给基础数组。 在内部,切片是由 指向基础数组中