go 协程使用陷阱

golang 语言协程

协程中使用全局变量、局部变量、指针、map、切片等作为参数时需要注意,此变量的值变化问题。 与for 循环,搭配使用更需谨慎。

1、内置函数时直接使用局部变量,未进行参数传递

func main() {
    for i := 0; i < 100; i++ {
        go func() {
            fmt.Println(i)
        }()
    }
}

运行效果
go 协程使用陷阱_第1张图片

func main() {
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
        }(i)
    }
}

运行效果
go 协程使用陷阱_第2张图片

2。地址传递的参数

type Per struct {
    name string
    bh   int
}

func main() {
    p := &Per{}
    for i := 0; i < 100; i++ {
        p.bh = i
        go func(p *Per) {
            fmt.Println(p)
        }(p)
    }
}

go 协程使用陷阱_第3张图片

分析: 导致以上非实际结果的原因是,go 之后并非立即启动协程的。

你可能感兴趣的:(golang,problem)