从goroutine func发出修改地图的问题

时间:2018-04-01 03:30:25

标签: multithreading pointers go maps goroutine

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()
}()

这是一段代码,我的问题是,我无法修改分数,我尝试使用指针,我尝试过正常,我已经尝试将其作为参数传递。

1 个答案:

答案 0 :(得分:2)

  

Package sync

     

导入&#34;同步&#34;

     

type WaitGroup

     

WaitGroup等待完成goroutine的集合。主要的   goroutine调用Add来设置要等待的goroutines的数量。然后   每个goroutine运行并在完成后调用Done。在同一个   时间,等待可以用来阻止所有goroutines完成。

您向我们提供了一个不起作用的代码片段。见How to create a Minimal, Complete, and Verifiable example.

作为猜测,您使用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