为了账号安全,请及时绑定邮箱和手机立即绑定

golang闭包(匿名函数)捕获错误的参数值

golang闭包(匿名函数)捕获错误的参数值

Go
泛舟湖上清波郎朗 2021-12-27 15:30:43
见测试代码:package mainimport "fmt"func main() {    i := 10    closure1 := func() {        fmt.Printf("closure, i: %d\n", i)        i = 15    }    closure1()    fmt.Printf("in main, i: %d\n", i)    closure2 := func(x int) {        fmt.Printf("function call, pass parameter, i: %d\n", x)    }    i = 20    closure1()    closure2(i)}我认为closure2的输出应该是20,但实际结果是15,我不知道为什么????任何人都可以帮助我,请在我的代码中查看我的评论,提前致谢。
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

问题是您在调用时首先将 i 分配给 15closure1()然后关闭两个您打印它..您closure1() 在将 i 分配给 20后所做的.. 这就是问题所在,这应该可以解决您的问题:


package main


import "fmt"


func main() {

    i := 10


    closure1 := func() {

        fmt.Printf("closure, i: %d\n", i)

        i = 15

    }


    closure1()


    fmt.Printf("in main, i: %d\n", i)


    closure2 := func(x int) {

        fmt.Printf("function call, pass parameter, i: %d\n", x)

    }




    closure1()

    i = 20 // Now it assigns it back to 20.. So the result below will become 20...

    closure2(i)

}

你看到你的问题了吗?


查看完整回答
反对 回复 2021-12-27
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

closure1 的最后一行将 i 设置为 15。这个 i 属于 main() 上下文。

main 的最后一行再次调用closure1()。所以 main 中的 i 再次设置为 15。


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号