以下代码有什么问题?

package main

import (
    "sync"
)

const N = 10

var wg = &sync.WaitGroup{}

func main() {
    for i := 0; i < N; i++ {
        go func(i int) {
            wg.Add(1)
            println(i)
            defer wg.Done()
        }(i)
    }
    wg.Wait()
}

运行后的现象为什么都没有输出 WaitGroup(等待组)的目的是用于等待一组协程的结束。 内部会维护一个计数器 Add方法向内部计数加上delta Done方法减少WaitGroup计数器的值 Wait方法阻塞直到WaitGroup计数器减为0。

本题中,for 循环中go func 创建协程。 在协程运行是执行wg.Add(1)和wg.Done()

而在子goroutine运行前,主goroutine已经运行到wg.Wait()。这时候计数器为0因此不阻塞,main goroutine 结束后,进程结束。 因此子goroutine没有输出内容

修改:

func main() {
    for i := 0; i < N; i++ {
        wg.Add(1) // 1. ADD放到主goroutine中
        go func(i int) {
            defer wg.Done() // 2. 建议一进来就执行defer wg.Done(),预防panic导致Done方法未执行
            println(i)
        }(i)
    }
    wg.Wait()
}