複数のgoroutineで並列処理するならWaitGroupが便利だって聞いた
waitgroup.go
package main
import (
"fmt"
"sync"
)
func main() {
wait := &sync.WaitGroup{} // WaitGroup作成
for i := 0; i < 10; i++ {
index := i
wait.Add(1) // waitインクリメント
go func() {
defer wait.Done() // goroutineが終わったらデクリメント
if err := DoSomething(); err != nil {
fmt.Println("error!", index)
return // deferでwait.Done()することで、return処理が書きやすい
}
fmt.Println("success!", index)
}()
}
wait.Wait() // 全てのwaitの終了を待つ
}
func DoSomething() error {
// do something
return nil
}
$ go run waitgroup.go
success! 9
success! 2
success! 3
success! 1
success! 6
success! 5
success! 7
success! 8
success! 0
success! 4