问题是您要将传递
sync.WaitGroup给goroutines 的副本,而不是引用(即指针):
package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc main() { numOfGoRoutines := 10 wg.Add(numOfGoRoutines) ch := make(chan int, numOfGoRoutines) for i := 0; i < numOfGoRoutines; i++ { a := i go sqr(ch, a, &wg) } wg.Wait() fmt.Println("After WAIT") close(ch) var res int for i := range ch { res += i } ch = nil fmt.Println("result = ", res)}func sqr(ch chan int, val int, wg *sync.WaitGroup) { fmt.Println("go - ", val) s := val * val ch <- s wg.Done()}
另外,由于
wg是全局变量,您可以完全删除该参数:
package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc main() { numOfGoRoutines := 10 wg.Add(numOfGoRoutines) ch := make(chan int, numOfGoRoutines) for i := 0; i < numOfGoRoutines; i++ { a := i go sqr(ch, a) } wg.Wait() fmt.Println("After WAIT") close(ch) var res int for i := range ch { res += i } ch = nil fmt.Println("result = ", res)}func sqr(ch chan int, val int) { fmt.Println("go - ", val) s := val * val ch <- s wg.Done()}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)