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

Golang匿名函数参数的作用

标签:
Go

今天写代码的时候用到了协程go func,发现func函数块内部的代码也能使用外部的局部变量,当时我就加上了打印发现闭包内部的变量值和外部的局部变量是一样的,就觉得很费解匿名函数的传参是什么用的?

然后我就做了个小实验,运行如下代码

func main()  {    i := 1

    go func() {
        time.Sleep(100*time.Millisecond)
        fmt.Println("i =", i)
    } ()    i++    time.Sleep(1000*time.Millisecond)
}

打印如下

i= 2

Process finished with exit code 0

这就说明了闭包内取外部函数的参数的时候是取的地址,而不是调用闭包时刻的参数值.我们通过如下代码验证我们的想法:

func main()  {    i := 1

    go func(i int) {
        time.Sleep(100*time.Millisecond)
        fmt.Println("i =", i)
    } (i)    i++    time.Sleep(1000*time.Millisecond)
}

输出为:

i = 1

Process finished with exit code 0

所以我们在使用go func的时候最好把可能改变的值通过值传递的方式传入到闭包之中,避免在协程运行的时候参数值改变导致结果不可预期



作者:cbsfly_
链接:https://www.jianshu.com/p/91140fdd6e91


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消