> For the complete documentation index, see [llms.txt](https://zakimaliki.gitbook.io/golang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://zakimaliki.gitbook.io/golang/cara-membuat-waitgroup-di-golang.md).

# Cara membuat WaitGroup di Golang

Di Go, `sync.WaitGroup` digunakan untuk menunggu sekelompok goroutine selesai sebelum melanjutkan eksekusi program. Ini sangat berguna ketika Anda ingin menunggu beberapa goroutine selesai sebelum menjalankan tindakan selanjutnya di program Anda.

Berikut adalah cara membuat dan menggunakan `sync.WaitGroup`:

1. **Membuat Wait Group:** Untuk membuat `sync.WaitGroup`, Anda cukup membuat variabel baru dari tipe `sync.WaitGroup` dan kemudian menggunakan metode `Add()` untuk menambahkan jumlah goroutine yang perlu ditunggu.

   ```go
   var wg sync.WaitGroup
   ```
2. **Menambahkan Goroutine ke Wait Group:** Setiap kali Anda meluncurkan sebuah goroutine yang perlu ditunggu oleh `WaitGroup`, Anda harus menambahkan jumlahnya menggunakan metode `Add()`.

   ```go
   func myGoroutine() {
       defer wg.Done() // Menandakan bahwa goroutine sudah selesai
       // ... (kode goroutine)
   }

   // Menambahkan goroutine ke Wait Group
   wg.Add(1)
   go myGoroutine()
   ```
3. **Menunggu Goroutine Selesai:** Setelah goroutine selesai, Anda harus memanggil metode `Done()` di dalam goroutine tersebut. `WaitGroup` akan menunggu hingga jumlah `Done()` yang dipanggil sama dengan jumlah `Add()` yang telah ditambahkan.

   ```go
   goCopy codewg.Done() // Menandakan bahwa goroutine sudah selesai
   ```
4. **Menunggu Semua Goroutine Selesai:** Setelah semua goroutine ditambahkan dan menjalankan `Wait()`, program akan berhenti dan menunggu sampai semua goroutine selesai.

   ```go
   goCopy codewg.Wait() // Menunggu semua goroutine selesai
   ```

Berikut adalah contoh lengkap penggunaan `sync.WaitGroup`:

```go
package main

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

func myGoroutine(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Menandakan bahwa goroutine sudah selesai
	time.Sleep(time.Second) // Contoh pekerjaan yang membutuhkan waktu satu detik
	fmt.Println("Goroutine", id, "selesai")
}

func main() {
	var wg sync.WaitGroup

	// Menambahkan 3 goroutine ke Wait Group
	for i := 1; i <= 3; i++ {
		wg.Add(1)
		go myGoroutine(i, &wg)
	}

	// Menunggu semua goroutine selesai
	wg.Wait()

	fmt.Println("Semua goroutine selesai. Lanjutkan eksekusi program.")
}
```

Pada contoh di atas, kita membuat tiga goroutine yang membutuhkan waktu satu detik untuk menyelesaikan tugasnya. `sync.WaitGroup` digunakan untuk menunggu ketiga goroutine selesai sebelum mencetak pesan "Semua goroutine selesai. Lanjutkan eksekusi program.". `WaitGroup` memastikan bahwa program menunggu hingga semua goroutine selesai sebelum melanjutkan eksekusi program utama.

Di bab berikutnya akan dibahas tentang bagaimana membuat Select statement di Golang
