Goのloop
loopのvariable
for _, v := range items { v := v go func(){ process(v) }() }
for _, v := range items { go func(v type) { process(v) }(v) }
loopとwait group
var wg sync.WaitGroup for _, v := range items { v := v wg.Add(1) go func(){ process(v) wg.Done() }() } wg.Wait()
loopとwaitgroupとchannel
var wg sync.WaitGroup ch := make(chan type) for _, v := range items { wg.Add(1) go func(v type) { defer wg.Done() res, _ := process(v) ch <- res }(v) } go func(){ wg.Wait() close(ch) }() for res := range { process(res) }
loopとwaitgroupとchannel、semaphore
var wg sync.WaitGroup ch := make(chan type) sem := make(chan struct{}, num) for _, v := range items { wg.Add(1) go func(v type) { defer wg.Done() sem <- struct{}{} res, _ := process(v) <-sem ch <- res }(v) } go func(){ wg.Wait() close(ch) }() for res := range { process(res) }