栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么这两个for循环变量会给我不同的行为?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么这两个for循环变量会给我不同的行为?

问题

loop1()
在于您将函数文字存储在
actions
引用 循环变量
的映射中
cmd
。该循环变量只有一个实例,因此在循环后调用
actions
映射中存储的函数时,所有实例都将引用此单个循环变量(之所以保留,是因为函数/闭包仍然引用了该变量),但是它
在执行 时的值将是
for
循环设置的最后一个值,即
cmds
切片中的最后一个值(即
"update"
,因此您将看到
"update"
打印3次)。

一个简单的解决方法是制作此循环变量的副本,因此,每次迭代,每个函数文字都将有其自己的副本,该副本与循环变量“分离”:

func loop1() {    actions := make(map[string]func())    for _, cmd := range cmds {        cmd2 := cmd        actions[cmd] = func() { fmt.Println(cmd2) // Refer to the detached, copy variable!        }    }    for _, action := range actions {        action()    }}

这样,输出

loop1()
(在Go Playground上尝试):

updatecreatedelete

这不是的问题

for ...range
,这是因为闭包引用的是同一个变量,并且您不会仅在循环之后立即使用变量的值。当您打印此变量的值时,所有变量都将打印相同的最后一个值。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/417731.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号