# Concurrency - WaitGroup

WaitGroup digunakan untuk menunggu sampai beberapa collection dari goroutine selesai berjalan. Jadi WaitGroup digunakan untuk blocking statement selanjutnya sampai proses goroutine selesai.

Misalnya kita mempunyai 3 goroutine yang akan dijalankan pada fungsi `main` . Maka fungsi `main` akan menunggu sampai ketiga goroutine selesai dieksekusi barulah melanjutkan statement berikutnya atau berhenti.

Untuk menggunakan WaitGroup, kita harus menggunakan package bawaan Go yaitu `sync.WaitGroup` .

Mari kita lihat contoh penggunaan WaitGroup:

```go
package main

import (  
    "fmt"
    "sync"
    "time"
)

func process(i int, wg *sync.WaitGroup) {  
    fmt.Println("started Goroutine ", i)
    time.Sleep(2 * time.Second)
    fmt.Printf("Goroutine %d ended\n", i)
    wg.Done()
}

func main() {  
    no := 3
    var wg sync.WaitGroup
    for i := 0; i < no; i++ {
        wg.Add(1)
        go process(i, &wg)
    }
    wg.Wait()
    fmt.Println("All go routines finished executing")
}
```

[WaitGroup](https://golang.org/pkg/sync/#WaitGroup) adalah sebuah tipe data. Pada kode di atas kita membuat zero value variabel dengan tipe `WaitGroup` pada line 18. Cara kerja `WaitGroup` adalah menggunakan counter. Ketika kita menjalankan fungsi `Add` dari `WaitGroup` and mengisi nilai argumen dengan nilai `int`, maka counter dari `WaitGroup` akan naik secara incremental dari nilai awal the yang kita isi pada argumen `Add` yaitu `1` . Lalu cara untuk menurunkan counter secara decrement adalah dengan memanggil fungsi `Done()` dari WaitGroup. Fungsi `Wait()` akan memblocking `Goroutine` yang dipanggil sampai counter bernilai `0` atau zero.

![Goroutine dijalankan menggunakan WaitGroup](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MTAlQajgUkpmyqOBew_%2F-MTAp5D2oELlNUIqa7K9%2FScreen%20Shot%202021-02-10%20at%2018.54.27.png?alt=media\&token=9c2a9c8a-2d7e-4023-95ed-9a8809bfb8ba)
