下面由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语言采坑:闭包共享变量问题的详细内容。