簡體   English   中英

修改goroutine中的結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM