• 一文看懂 IO 多路复用 at 2020年03月22日
  • golang 循环中的闭包问题 at 2017年06月13日

    @uguangtian

    你的意思是

    go v.printf()
    
    go func(){
        v.printf()
    }()
    

    这两种 go routine 启动方式不同在于 在第一种启动方式时,每次循环 v 都会被传递到 printf() ? 而第二种则不会么? 为啥?

    如果第一种启动方式每次都会传递正确的 v 值给 print 函数,那为什么只会传递指针,而在 TestClosure1 中的值就不会每次循环都传递给 print 函数呢?

  • golang 循环中的闭包问题 at 2017年06月13日

    @silenceshell 我感觉还是不能完全解释

    如果说 TestClosure1 循环中传给 print 函数的值是 v 的地址指针,那么在 TestClosure 循环中传的就不是了么? 那为什么在 TestClosure 中的 print 就可以拿到正确的每一个元素的指针,而 TestClosure1 中的 print 就不能拿到正确的元素的值呢?

    TestClosure1 中拿不到正确值的原因是 go routine 在启动之前 for 循环就结束了, 正如你所说的在循环中加一个 time.Sleep(), 所以说在 TestClosure1 中的 go routine 拿到的都是最后一个 v 的拷贝,也就是最后一个元素的值对应的指针。那为什么这个逻辑在 TestClosure 的循环中就不存在呢? 为什么 TestClosure 中的 print 函数拿到的就是正确的每个元素的指针,而不是最后一个元素的指针呢?

    而且如果你的解释是成立的话,把 TestClosure 中的 go routine 启动方式改成了:

    go func(){
        v.print()
    }()
    

    结果应该会不变才对, 那为什么实际的结果就是使用了这种启动方式之后,TestClosure 就变得和 TestClosure1 一样了呢?