首页  >  文章  >  后端开发  >  Golang中的Goroutine如何共享变量?

Golang中的Goroutine如何共享变量?

DDD
DDD原创
2024-11-05 14:11:02459浏览

How Do Goroutines in Golang Share Variables?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn