首页后端开发其他后端知识Go语言闭包共享变量的原因是什么,怎样解决

Go语言闭包共享变量的原因是什么,怎样解决

时间2024-03-28 03:46:03发布访客分类其他后端知识浏览1036
导读:关于“Go语言闭包共享变量的原因是什么,怎样解决”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“Go语言闭包共享变量...
关于“Go语言闭包共享变量的原因是什么,怎样解决”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“Go语言闭包共享变量的原因是什么,怎样解决”吧。


下面由golang教程栏目给大家分享一个go语言采坑:闭包共享变量问题,希望对需要的朋友有所帮助!

话不多说,直接看代码和注释:

package mainimport (
    "fmt"
    "time")func main() {
    
    // 错误示例(打印出的结果是5个6)
    fmt.Println("closure buggy example...")
    for i := 1;
     i = 5;
 i++ {

        // 每个goroutine共享一个变量,goroutine还没开始的时候,i已经变成了6
        go func() {

            fmt.Println(i)
        }
()
    }
    
    time.Sleep(1 * time.Second)


    // 正确示例1:
    fmt.Println("normal example...")
    for i := 1;
     i = 5;
 i++ {

        go func(i int) {
   // 使用局部变量
            fmt.Println(i)
        }
(i)
    }
    
    time.Sleep(1 * time.Second)

    // 正确示例2:
    fmt.Println("normal example 2...")
    for i := 1;
     i = 5;
 i++ {

        i := i  // 为每个闭包创建一个变量
        go func() {

            fmt.Println(i)
        }
()
    }

    time.Sleep(1 * time.Second)}
    

运行得到的结果如下:

closure buggy example...66666normal example...52134normal example 2...52134

原因和解决方法见代码注释。第一个例子是错误示例,第二、三个例子是正确示例。


以上就是关于“Go语言闭包共享变量的原因是什么,怎样解决”的介绍了,感谢各位的阅读,希望文本对大家有所帮助。如果想要了解更多知识,欢迎关注网络,小编每天都会为大家更新不同的知识。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Go语言闭包共享变量的原因是什么,怎样解决
本文地址: https://pptw.com/jishu/654678.html
jQuery的Sizzle怎么样使用,能做什么 jQuery有什么方法解决IE输入框无法输入的情况

游客 回复需填写必要信息