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)
}