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

2024-04-09

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功能。在某一点aHtmlTag指针被推入切片matchingDivs。之后append在让函数再次递归调用自身之前,我检查了matchingDiv 切片的内容。然后在 if 下面append完成后,该函数会递归调用自身一次。我停在fmt.Println(htmlTag.Class)并检查内容matchingDivs再切片。而且内容也和以前完全不一样了。

曾经只有一个append,内容怎么能变呢?做golang使用相同的HtmlTag指针,每次我将它传递到下一个递归调用时?


The tag变量在循环开始时声明一次,其值tag在每次迭代时都会被覆盖。这与您在中看到的问题相同FAQ https://golang.org/doc/faq with: “闭包作为 goroutine 运行会发生什么?” https://golang.org/doc/faq#closures_and_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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 设置 XGBoost 提前停止的 Tol

    我正在使用 XGBoost 并提前停止 经过大约 1000 个 epoch 后 模型仍在改进 但改进的幅度非常低 IE clf xgb train params dtrain num boost round num rounds evals
  • 编写 webkit Css 后滚动条中没有箭头按钮

    请参阅此处的表格 http www funkkopfhoerer test com vergleichstabelle funkkopfhoerer http www funkkopfhoerer test com vergleichsta
  • Android中自定义圆形复选框

    我正在尝试获取 Google 应用程序照片选择 UI 我正在使用 Appcompat 复选框来实现这一目标 但没有成功 我正在努力的步骤 1 将复选框背景设置为自定义圆形 2 在xml中定义自定义形状 这是我的复选框 xml 的样子
  • ASP.NET Core SignalR websocket 连接限制

    我使用 Microsoft AspNetCore SignalR Client 对在 Windows Server 2016 标准上托管的 SignalR ASP NET Core 应用程序进行负载测试 安装了 Dotnet 核心托管 2
  • 模板参数 - 带有可变参数的函数指针

    我知道我可以这样做 template
  • 如何在春季结束会话 3

    我在用 SessionAttributes在春天 但我不知道如何结束会话 我尝试了下面的代码 但出现错误 请给我一些例子 Thanks RequestMapping value LogoutAction public String logo
  • 在没有受信任证书的情况下安装 .appx?

    我有一个 Windows 8 应用程序 我想将其部署到我的 Windows RT 2 我只有 appx 我想绕过商店安装它进行测试 但是 当我运行命令时 Add AppxPackage
  • 克隆二叉树的时间复杂度

    我想知道克隆二叉树的代码的时间复杂度是否为 O n 如果是 O n 你能解释一下为什么吗 如果没有 你能建议一种时间复杂度为 O n 的方法吗 public TreeNode cloneTree TreeNode root if root
  • 需要查看sql中的一个日期范围是否与另一个日期范围重叠

    我有一个存储房间预订的表 其架构是 ID ROOM ID CHECK IN DATE CHECK OUT DATE USER ID 我需要对一组日期范围内可用 不可用的房间运行搜索查询 另请记住 还有另一个表保存预订房间的日期 其格式如下
  • Angular 5 的子路由无法正常工作

    您好 我正在尝试使用子路由 但它无法按预期工作 我的 Angular 5 结构 在这种情况下 顶部导航包含加载子模块的链接 子导航包含更新子模块内容的链接 应用程序模块 和应用程序组件 包含一个顶部导航栏 用于导航到不同的子模块 应用程序组
  • 根据任何列值从数据框中删除行[重复]

    这个问题在这里已经有答案了 我有一个这样的数据框 Plate MeanV1 MeanV2 MeanV3 etc 0 1 3 2 4 8 6 8 1 1 3 1 10000 10000 2 2 2 8 4 6 6 1 3 2 2 9 5 1
  • 删除使用闭包语法按名称创建的通知中心观察者是否足够?

    我有一些使用块 尾随闭包语法创建的通知 如下所示 NotificationCenter default addObserver forName NSManagedObjectContextObjectsDidChange object mo
  • RESTful:在一个请求中创建多条记录

    我有一个允许用户向其他人发送邀请的表单 邀请的数量可由用户在用户界面中配置 并且理论上可以是无限的 用户需要为每个邀请定义一个电子邮件地址 单击 发送 时 理想情况下应该向服务器发送一个请求 将所有记录包装在一次批量提交中 尽管这并不是真正
  • Nhibernate - 找不到属性的 getter

    我正在尝试构建 MusicStore Nhibernate 端口 但遇到了此错误 无法在类中找到属性 OrderInfo 的 getter MvcMusicStore Models OrderDetail 但有以下内部异常 NHiberna
  • 对于某些 Windows 命令,nodejs exec 命令失败,并且没有明确的错误消息

    我的程序中有一个编辑器 可以动态编写命令并执行它们 我想通过 child process exec 将 myPublish 目录中的所有文件和文件夹移动到当前目录 我在 Windows 中使用 robocopy 命令 当我在 cmd 中测试
  • 什么是 Azure 的 Microsoft.Insights 资源提供程序?

    我刚刚开始使用 Azure 发现我没有获得任何存储和其他资源的指标 因为我没有microsoft insights资源提供者作为我订阅的一部分 我注册了我的订阅microsoft insights我得到了我想要的所有数据 但我想知道注册的含
  • 收藏的意义何在

    我一直在阅读Effective Java 并且遇到了无界集合类型当我们只能插入null元素 因为它看起来毫无意义 我一直在试图弄清楚这个概念 但它似乎没有多大意义 任何帮助将非常感激 Collection collection Object
  • Sql*plus 总是返回退出代码 0?

    每当我使用 Sql plus 运行 sql 脚本并检查 时 即使脚本不成功 我也会得到 0 Example sqlplus user password instance script sql SQL Plus Release 10 2 0
  • 在今天和昨天之间选择

    我正在尝试在两个日期之间进行选择 如下所示 SELECT p Code p Name sum h PA 1 AS PA sum h PB 1 AS PB sum h PG 1 AS PG sum h GoedkeuringDoorNew G
  • golang - 切片中指针的内容在递归函数运行期间发生变化

    func getAllCertainDivs className string idName string htmlTag HtmlTag matchingDivs HtmlTag fmt Println htmlTag Class if