此修复程序有两个部分,不要在goroutines之间共享切片,然后在中
queue同步范围
main。
import ( "fmt" "strconv" "sync")func cat_strings(a int, b string) []string { var y []string j := strconv.Itoa(a) y = append(y, j) y = append(y, b) return y}func main() { var slice []string var wg sync.WaitGroup queue := make(chan []string, 10) wg.Add(10) for i := 0; i < 10; i++ { go func(i int) { defer wg.Done() queue <- cat_strings(i, "var") }(i) } go func() { wg.Wait() close(queue) }() for t := range queue { slice = append(slice, t...) } fmt.Println(slice)}没有
x必要在goroutine之间共享额外的片段。如果每个goroutine需要另一个切片,则为每个切片定义一个新切片。共享单个片总是需要额外的同步。
另一场比赛是在从追加
queue到
slice切片的goruoutine
和决赛之间
fmt.Println。没有理由并发执行这些操作,因为您不希望在读取所有值之前就进行打印,因此请在打印最终值之前完全完成for-
range循环。



