修改goroutine中的结构?

时间:2017-03-11 12:53:25

标签: go struct concurrency goroutine

我正在试验goroutines,似乎我无法在goroutine中修改结构的值(下面的例子)。有没有解决这个问题?

编辑:如果我放置一个sleep语句,代码就会运行,表明如果给定更多时间,goroutines会运行,但是在main()中的所有内容都已执行之后它们就会运行。在继续之前,我如何“等待”我的goroutines完成?

package main

import (
    "fmt"
)

type num struct {
    val int
}

func (d *num) cube_val() {
    fmt.Println("changing value...")
    d.val = d.val*d.val*d.val 
}

func main() {
    a := []num{num{1},num{3},num{2},num{5},num{4}}
    for i := range a {
        go a[i].cube_val()
    }
    // code that waits for go routines to finish should get inserted here ...
    fmt.Println(a) // change does NOT happen

    for i := range a {
        a[i].cube_val()
    }
    fmt.Println(a) // change happens, and fmt.Println statements worked?
}

1 个答案:

答案 0 :(得分:5)

变化确实发生了。但是在fmt.Println(a)之后他们发生了。 事实上,goroutine和print语句的执行顺序无法保证,没有同步

如果你想在goroutine完成后发生fmt.Println(a),你必须等待它们,例如:(see also on Playground

func main() {
    var wg sync.WaitGroup
    a := []num{num{1}, num{3}, num{2}, num{5}, num{4}}
    for i := range a {
        wg.Add(1)
        go func(d *num) {
            defer wg.Done()
            d.cube_val()
        }(&a[i])
    }

    wg.Wait()

    fmt.Println(a)
}