Go 中捕获的闭包:了解 Range 循环变量行为
在 Go 中,for...range 循环与其他 for 相比,其行为有所不同 -由于它们被视为闭包而导致循环。本文探讨了在闭包变量中捕获范围循环变量的细微差别。
捕获范围循环中的闭包行为
与 C# 的 foreach 循环不同,Go 的 for...range循环捕获循环变量(例如键和值)作为闭包变量。然而,Go 并不直接从循环范围捕获这些变量。相反,它将它们捕获为循环闭包中最后分配的值。
当尝试使用闭包在 Go 中创建元组时,此行为变得明显,如示例代码所示。闭包捕获在 for...range 循环期间分配给 k 和 v 变量的最后一个值,从而导致不正确的行为。
修复:复制捕获变量
为了解决这个问题,有必要在将循环变量捕获到循环变量中之前使用 := 运算符显式地将它们复制到局部变量中。
for k, v := range m { kLocal, vLocal := k, v // Copy values to local variables f[i] = func() { return kLocal, vLocal } }
通过将 k 和 v 复制到 kLocal 和 vLocal,闭包现在可以在 for...range 迭代期间正确访问循环变量的预期值。
闭包与函数文字
注意 Go 中闭包和函数文字之间的区别非常重要。函数字面量创建一个绑定到当前作用域的新函数,而闭包保留对其封闭作用域和共享变量的访问。
值循环与变量循环
此外, Go 区分值循环和变量循环,其中值循环将循环变量的副本绑定到每个闭包,而变量循环则绑定实际的循环变量本身。正如示例代码中所观察到的,这可能会导致不同的行为。
总之,在 Go 中捕获闭包内的范围循环变量需要注意闭包的范围以及使用局部变量来复制所需值。理解这些概念对于编写有效且健壮的 Go 代码至关重要。
以上是Go 的'for...range”循环如何处理闭包变量,以及如何避免意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

本文解释了GO的软件包导入机制:命名imports(例如导入“ fmt”)和空白导入(例如导入_ fmt; fmt;)。 命名导入使包装内容可访问,而空白导入仅执行t

本文解释了Beego的NewFlash()函数,用于Web应用程序中的页间数据传输。 它专注于使用newflash()在控制器之间显示临时消息(成功,错误,警告),并利用会话机制。 Lima

本文详细介绍了MySQL查询结果的有效转换为GO结构切片。 它强调使用数据库/SQL的扫描方法来最佳性能,避免手动解析。 使用DB标签和Robus的结构现场映射的最佳实践

本文演示了创建模拟和存根进行单元测试。 它强调使用接口,提供模拟实现的示例,并讨论最佳实践,例如保持模拟集中并使用断言库。 文章

本文探讨了GO的仿制药自定义类型约束。 它详细介绍了界面如何定义通用功能的最低类型要求,从而改善了类型的安全性和代码可重复使用性。 本文还讨论了局限性和最佳实践

本文详细介绍了在GO中详细介绍有效的文件,将OS.WriteFile(适用于小文件)与OS.openfile和缓冲写入(最佳大型文件)进行比较。 它强调了使用延迟并检查特定错误的可靠错误处理。

本文使用跟踪工具探讨了GO应用程序执行流。 它讨论了手册和自动仪器技术,比较诸如Jaeger,Zipkin和Opentelemetry之类的工具,并突出显示有效的数据可视化


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3汉化版
中文版,非常好用

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境