[英]Modifying a struct in a goroutine?
我正在嘗試使用goroutine,但似乎無法修改goroutine中的struct值(下面的示例)。 有什么解決辦法嗎?
編輯:看來,如果我放置一個sleep語句,代碼就會運行,這表明如果有更多的時間,goroutines將運行,但是它們在main()中的所有內容都已執行后才完成運行。 如何繼續等待我的goroutine完成,然后再繼續?
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)
之后發生了。 事實上,有是夠程和打印語句的執行順序沒有擔保, 沒有同步 。
如果您希望在goroutine完成后執行fmt.Println(a)
,則必須等待它們,例如:( 另請參見在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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.