最近我在编程中遇到了一个诡异的bug,调试半天才发现问题所在。将问题简化后,我把这个坑发在这里作是一个记录。简而言之,这个坑其实并不难,问题的核心其实是两个很基础的golang知识:1.闭包函数使用的变量会受到外部影响。2.协程并不保证在创建后立刻运行。
单刀直入看例子:
ii
i
iiii
第四组则是为了验证上面的解释,每次循环停1s,这样足以每个协程运行完毕。
第五组则是进一步探究,从第一个协程运行进入匿名函数到调用Println将i的值复制入栈这段时间究竟可以让外层主线程循环多少次呢?答案是37次。这样看来go语言启动协程确实很快。
以上。