从多个goroutine添加到等待组是否安全?

If I have multiple go routines concurrently adding and calling done to a waitgroup. Is this safe from a concurrency perspective? Most waitgroup examples I've seen keep the adding in a single go-routine that calls/creates the others.

Calling Done from multiple routines is safe and is the recommended usage of WaitGroup per the documentation. The reason to call Add from the goroutine that spawns more routines is not because Add is not thread-safe, it is because of the possibility that code like this:

for ... {
    go func() {
        wg.Add(1)
        defer wg.Done()
        ...
    }()
}
wg.Wait()

May get to the wg.Wait() before any of the calls to Add are executed, when the counter is still at zero, thereby defeating the purpose. The execution order of concurrent code is non-deterministic.