Interesting question. I think the code is fine.
From the spec:
> The function value and parameters are evaluated as usual in the calling goroutine, but unlike with a regular call, program execution does not wait for the invoked function to complete.
This means `onedoer.do` is immediately evaluated, before the loop continues. The usual issue with loops is due to closures. So, this would be wrong and have exactly the issue you are worried about:
go func() { oneoder(&wg) }
}
But the go statement isn't equivalent to that, it doesn't close over the function value, it evaluates it.