Inner goroutine can send event to outer goroutine by channel
Ex. Pass value to inner routine function
Declare a variable in inner goroutine function, use outer variable will be wrong because that variable value will be changed in for loop
Ex. Send error to errorChannel from inner goroutine。may goroutine leak.
Solution is to use a buffered channel to prevent block.
Another solution is to use abother goroutine to get error.
Need sync.WaitGroup to make sure items to process all done. Wait done in a goroutine when main channel is used to receive msg from goroutine
Add must be callled before goroutine start, otherwise cant make sure add happens before done
Done same as Add(-1)