在goroutine中修改结构?

在goroutine中修改结构?,go,struct,concurrency,goroutine,Go,Struct,Concurrency,Goroutine,我正在试验goroutine,似乎我无法在goroutine中修改结构的值(下面的示例)。这方面有什么办法吗 编辑:如果我放置一个sleep语句,代码似乎会运行,这表明如果给goroutines更多的时间,它们会运行,但它们会在main()中的所有内容都已执行后完成运行。在继续之前,我如何“等待”goroutines完成 package main import ( "fmt" ) type num struct { val int } func (d *num) cube_

我正在试验goroutine,似乎我无法在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?
}

变化确实发生了。但是它们发生在
fmt.Println(a)
之后。 事实上,如果没有同步,就不能保证goroutines和print语句的执行顺序

如果希望
fmt.Println(a)
发生在goroutine完成之后,则必须等待它们,例如:()


变化确实发生了。但是它们发生在
fmt.Println(a)
之后。 事实上,如果没有同步,就不能保证goroutines和print语句的执行顺序

如果希望
fmt.Println(a)
发生在goroutine完成之后,则必须等待它们,例如:()

我相信你必须阻止go例行通话,因为无法保证通话已经或已经完成。您不能保证
a
已被更改,因此为什么让它睡眠会导致go例程完成。这可能会对你有所帮助:我认为你必须阻止go例行电话,因为无法保证电话已经拨打或已经完成。您不能保证
a
已被更改,因此为什么让它睡眠会导致go例程完成。这可能会帮助您:
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)
}