go语言闭包捕获的是变量的引用而不是变量的值
在 Go 语言中,闭包捕获的是变量的引用,而不是变量的值。这意味着闭包会引用循环变量或外部变量的实际内存位置,而不是在闭包创建时复制变量的值。这种行为有时会导致意外的结果,尤其是在循环中创建多个闭包时。

闭包捕获变量的引用
考虑以下示例代码:
package mainimport ("fmt""sync"
)func main() {var wg sync.WaitGroupfor i := 0; i < 5; i++ {wg.Add(1)go func() {defer wg.Done()fmt.Println(i)}()}wg.Wait()
}
在这个示例中,所有 goroutine 捕获的是同一个 i 变量的引用。当所有 goroutine 开始执行时,i 的值已经是 5(因为循环已经结束),所以所有 goroutine 都会打印 5。
解决方法
为了避免这种问题,可以采取以下两种方法之一:
方法一:使用匿名函数参数
通过将循环变量作为参数传递给匿名函数,可以确保每个 goroutine 捕获的是不同的值。
package mainimport ("fmt""sync"
)func main() {var wg sync.WaitGroupfor i := 0; i < 5; i++ {wg.Add(1)go func(i int) { // 将 i 作为参数传递defer wg.Done()fmt.Println(i)}(i)}wg.Wait()
}
在这个示例中,每次循环迭代都会创建一个新的匿名函数,并将当前的 i 值作为参数传递给这个函数。每个 goroutine 捕获的是传递给匿名函数的 i 参数,而不是循环变量 i 本身。这样每个 goroutine 都会打印出不同的值。
方法二:使用局部变量
通过在每次循环迭代中创建一个新的局部变量,可以确保每个 goroutine 捕获的是不同的变量。
package mainimport ("fmt""sync"
)func main() {var wg sync.WaitGroupfor i := 0; i < 5; i++ {wg.Add(1)j := i // 创建一个新的局部变量go func() {defer wg.Done()fmt.Println(j)}()}wg.Wait()
}
在这个示例中,每次循环迭代都会创建一个新的局部变量 j,并将当前的 i 值赋给 j。每个 goroutine 捕获的是不同的 j 变量,而不是循环变量 i 本身。这样每个 goroutine 也会打印出不同的值。
总结
在 Go 语言中,闭包捕获的是变量的引用,而不是变量的值。这意味着闭包会引用变量的实际内存位置,而不是在闭包创建时复制变量的值。为了避免在循环中创建多个闭包时出现意外的结果,可以使用匿名函数参数或将循环变量赋值给一个新的局部变量,确保每个 goroutine 捕获的是不同的变量。这两种方法都可以有效解决这个问题,确保每个 goroutine 打印出预期的值。
相关文章:
go语言闭包捕获的是变量的引用而不是变量的值
在 Go 语言中,闭包捕获的是变量的引用,而不是变量的值。这意味着闭包会引用循环变量或外部变量的实际内存位置,而不是在闭包创建时复制变量的值。这种行为有时会导致意外的结果,尤其是在循环中创建多个闭包时。 闭包捕获变量的引…...
周期法频率计的设计
目录 周期法频率计 分析: 设计过程: 周期法频率计 对于低频信号,应用周期法进行测频。周期法测频的基本原理是:应用标准频率信号统计被测信号两个相邻脉冲之间的脉冲数,然后通过脉冲数计算出被测信号的周期ÿ…...
【Linux】drop cache与reclaim的区别
前言 在 Linux 内核中,drop cache和reclaim是两种不同的内存管理机制,它们的目的和实现方式有所不同。 Drop Cache 定义 drop cache 是一种手动操作,允许用户通过向 /proc/sys/vm/drop_caches 写入特定的值,直接清除系统中的缓…...
【Linux课程学习】:命令行参数,环境变量
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 命令行参数: 用命令行参数实现不同…...
HTB:WifineticTwo[WriteUP]
目录 连接至HTB服务器并启动靶机 信息搜集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放端口进行脚本、服务扫描 使用curl访问靶机8080端口 使用浏览器直接访问/login路径 漏洞利用 使用searchsploit搜索该WebAPP漏洞 Payload USER_FLAG:bb…...
mac安装Pytest、Allure、brew
安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令:brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…...
关于相机选型的一些参数说明
上一篇:关于相机的一些参数计算(靶面、视野等) 目录 1.卷帘快门和全局快门1.1 卷帘快门1.2 全局快门PS:视觉伺服与快门选择 2.黑白和彩色3.CCD和CMOS3.1 CCD3.2 CMOSCCD VS CMOS 4.面阵和线扫4.1 面阵4.2 线扫4.3 面阵 VS 线扫 5.…...
深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践20241120
深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践 任务调度是后台服务中的重要组成部分,无论是定期数据备份、日志归档还是周期性报表生成,Cron 表达式始终是描述这些任务规则的核心工具。本文将聚焦 Spring Cron 表…...
24软专 数据结构
1、A[n],k,将数组向右循环移动k位。要求时间复杂度O(n),空间O(1)。 思路:采用三次反转数组的操作,可以实现时间复杂度为O(n),空间复杂度为O(1)的算法。 void moveElem(int array[],int k,int length){//a…...
洛谷 P1616 疯狂的采药 C语言 记忆化搜索
题目: https://www.luogu.com.cn/problem/P1616?contestId215526 完全背包问题,最后一个超出空间了。完全背包和就是无限次的拿,公式跟01背包差不多。 但是,只有当前能拿和拿不下,换下一个。注意要处理好边界条件。…...
#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
element-plus入门教程:Button
一、Button组件概述 Element Plus的Button组件是一个常用的操作按钮,提供了多种类型、尺寸、状态等配置选项,以满足不同的交互需求。 二、安装Element Plus 在Vue 3项目中,可以通过npm或yarn来安装Element Plus。 npm install element-pl…...
oneplus6线刷、trwp、magisk(apatch)、LSPosed、Shamiko、Hide My Applist
oneplus6线刷android10.0.1 oneplus6线刷包(官方android10.0.1)下载、线刷教程: OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip 启用开发者模式 设置 / 连续点击6次版本号 : 启用开发者模式设置/开发者模式/{打开 usb调试, 打开 网络adb调试,…...
flux的版本
1.flux1-dev.safetensors https://huggingface.co/black-forest-labs/FLUX.1-devhttps://huggingface.co/black-forest-labs/FLUX.1-dev原生的23.8G的模型。原生12B的模型,float16的。需要配合ae.safetensors,flux1-dev.safetensors以及clip-l和T5的权重使用,注意ae.sft和f…...
Kafka 数据倾斜:原因、影响与解决方案
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
【从零开始的LeetCode-算法】3297. 统计重新排列后包含另一个字符串的子字符串数目 I
给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新排列后,word2 是重排字符串的 前缀,那么我们称字符串 x 是 合法的 。 请你返回 word1 中 合法 子字符串的数目。 示例 1: 输入:word1 "bcca", word2 "…...
【2024APMCM亚太赛A题】完整参考论文与代码分享
A题 一、问题重述二、问题分析问题一:水下图像分类问题二:退化原因建模问题三:针对单一退化的图像增强方法问题四:复杂场景的综合增强模型问题五:针对性增强与综合增强的比较 三、问题假设退化特征独立性假设物理模型普…...
Excel求和如何过滤错误值
一、问题的提出 平时,我们在使用Excel时,最常用的功能就是求和了,一说到求和你可能想到用sum函数,但是如果sum的求和区域有#value #Div等错误值怎么办?如下图,记算C列中工资的总和。 直接用肯定会报错&…...
Android 常用命令和工具解析之GPU相关
目录 1、GPU基本信息 1.1 获取GPU基本信息 1.2 伪造GPU基本信息 2、GPU内存信息 3、经典案例 案例1:GPU伪造信息方案 案例2:GPU内存统计算法 GPU 指的是 Graphics Processing Unit,即图形处理单元。GPU 是一种专门用于处理图形和图像相…...
刷题——【模板】二维前缀和
前缀和 题目题目链接题解方法一方法二 题目 描述 给你一个 n 行 m 列的矩阵 A ,下标从1开始。 接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2 请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和, 输入描述&#x…...
实战复盘:从帕鲁杯应急响应赛题看企业级安全事件调查全流程
企业级安全事件调查实战指南:从CTF赛题到真实攻防溯源 在网络安全领域,应急响应能力直接决定了企业遭受攻击后的损失程度。去年某大型电商平台因未能及时识别攻击链,导致用户数据持续泄露长达三周,最终造成数亿元的直接损失。这类…...
BetterJoy终极指南:让Switch手柄在Windows上完美运行
BetterJoy终极指南:让Switch手柄在Windows上完美运行 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.com/g…...
FPGA实战:手把手教你用Verilog给NAND Flash数据上把“安全锁”(附完整ECC代码)
FPGA实战:用Verilog为NAND Flash打造硬件级ECC防护系统 1. 为什么你的NAND Flash需要硬件ECC? NAND Flash存储芯片在工业控制、物联网终端和边缘计算设备中扮演着关键角色,但它的物理特性导致数据可靠性存在先天缺陷。想象一下,当…...
Vivado项目文件太多分不清?这份FPGA开发必备的‘文件后缀速查手册’请收好
Vivado项目文件管理终极指南:从后缀识别到高效工作流 当你第一次打开一个成熟的Vivado项目文件夹时,那种面对几十种陌生文件后缀的茫然感,相信每个FPGA开发者都记忆犹新。就像走进了一个满是神秘符号的仓库,每个文件似乎都在向你发…...
车载Android Auto兼容性开发全链路(车规级Java SDK集成手册)
第一章:车载Android Auto兼容性开发全链路概览Android Auto 是 Google 提供的车载信息娱乐系统集成框架,其兼容性开发并非仅限于应用层适配,而是一条横跨设备端、车机系统、认证流程与用户交互的完整技术链路。开发者需同步关注 Android 应用…...
Unity渲染流水线中的NDC空间:从齐次裁剪到屏幕坐标的完整转换指南
Unity渲染流水线中的NDC空间:从齐次裁剪到屏幕坐标的完整转换指南 在Unity引擎的渲染流水线中,理解NDC(归一化设备坐标)空间的作用至关重要。这个看似抽象的概念,实际上决定了3D场景如何最终呈现在2D屏幕上。对于想要深…...
如何通过 SEO 优化提高企业品牌的曝光度
SEO优化提高企业品牌曝光度的关键策略 在当今数字化时代,企业品牌的曝光度直接关系到其市场竞争力和商业成功。SEO(搜索引擎优化)是提升企业品牌在搜索引擎中排名的重要手段。本文将详细探讨如何通过SEO优化提高企业品牌的曝光度,…...
DMA传输效率翻倍秘籍:深入解析Burst/Transfer模式在TMS320系列DSP中的配置陷阱
DMA传输效率翻倍秘籍:深入解析Burst/Transfer模式在TMS320系列DSP中的配置陷阱 实时信号处理系统的性能瓶颈往往出现在数据传输环节。当工程师面对高速ADC采集的海量数据时,DMA控制器的高效配置直接决定了系统能否实现理论上的吞吐量。本文将深入剖析TMS…...
3步解锁显卡潜力:OptiScaler跨平台开源上采样技术配置攻略
3步解锁显卡潜力:OptiScaler跨平台开源上采样技术配置攻略 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR3 FG on non-FG titles. Supports Nukem mo…...
Hadoop 3.3.5 分布式集群部署
环境准备与规划硬件要求:3台节点(1主2从)软件依赖:JDK 8、SSH免密登录目录规范:统一安装路径(如/opt/module),用户权限管理Hadoop安装与核心配置一定要检查一下,ssh 能不…...
