Golang 中的 Goroutines 如何共享变量
在学习 Golang 的并发特性时,出现了一个有趣的问题:goroutines 如何共享变量?一个简单的示例说明了细微差别的行为。
示例 1
考虑以下代码:
<code class="go">package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) x := i go func() { defer wg.Done() fmt.Println(x) }() } wg.Wait() fmt.Println("Done") }</code>
输出:
<code class="text">4 0 1 3 2</code>
每个 goroutine 都正确打印了预期的值。
示例 2
现在,让我们稍微修改一下代码:
<code class="go">package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(i) }() } wg.Wait() fmt.Println("Done") }</code>
输出:
<code class="text">5 5 5 5 5</code>
说明
这些示例的区别在于 goroutine 捕获变量 x 的方式。在示例 1 中,每个 goroutine 中都会创建一个新的局部变量 x,从而允许它们访问正确的值。
然而,在示例 2 中,goroutine 捕获了变量 i,这是一个循环变量。随着循环迭代,i 被更新,导致所有 goroutine 在运行时引用相同的值。
这种差异凸显了 Go 并发中变量作用域的重要性。为了避免竞争条件和不可预测的行为,必须在新的局部变量中捕获预期值。
以上是Golang中的Goroutine如何共享变量?的详细内容。更多信息请关注PHP中文网其他相关文章!