簡體   English   中英

從Goroutine Func修改地圖時出現問題

[英]Issue modifying map from goroutine func

scores := make(map[string]int)
percentage := make(map[string]float64)
total := 0

for i, ans := range answers {
    answers[i] = strings.ToLower(ans)
}

wg := sync.WaitGroup{}

go func() {
    wg.Add(1)

    body, _ := google(question)

    for _, ans := range answers {
        count := strings.Count(body, ans)
        total += count
        scores[ans] += 5 // <------------------- This doesn't work
    }

    wg.Done()
}()

這是一小段代碼,我的問題是,我無法修改得分,我嘗試使用指針,嘗試正常進行操作,嘗試將其作為參數傳遞。

包裹同步

導入“同步”

輸入WaitGroup

WaitGroup等待goroutine的集合完成。 主goroutine調用添加以設置要等待的goroutine的數量。 然后,每個goroutine都會運行並在完成后調用Done。 同時,可以使用Wait來阻塞,直到所有goroutine完成。


您已為我們提供了無效的代碼片段。 請參閱如何創建最小,完整和可驗證的示例。

猜測,您對sync.WaitGroup的使用看起來很奇怪。 例如,通過簡單地遵循sync.Waitgroup文檔中的說明,我希望得到的內容類似於以下內容:

package main

import (
    "fmt"
    "strings"
    "sync"
)

func google(string) (string, error) { return "yes", nil }

func main() {
    question := "question?"
    answers := []string{"yes", "no"}

    scores := make(map[string]int)
    total := 0

    wg := sync.WaitGroup{}
    wg.Add(1)
    go func() {
        defer wg.Done()

        body, _ := google(question)
        for _, ans := range answers {
            count := strings.Count(body, ans)
            total += count
            scores[ans] += 5 // <-- This does work
        }
    }()
    wg.Wait()

    fmt.Println(scores, total)
}

游樂場: https : //play.golang.org/p/sZmB2Dc5RjL

輸出:

map[yes:5 no:5] 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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