Goroutine
Goroutine adalah lightweight thread yang dikelola oleh Go runtime. Membuat goroutine sangat murah — kamu bisa menjalankan ribuan bahkan jutaan goroutine secara bersamaan.
Membuat Goroutine
Cukup tambahkan keyword go sebelum pemanggilan fungsi:
func cetakPesan(pesan string) {
for i := 0; i < 3; i++ {
fmt.Println(pesan)
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go cetakPesan("Goroutine 1")
go cetakPesan("Goroutine 2")
cetakPesan("Main")
}
Goroutine vs Thread OS
| Aspek | Goroutine | Thread OS |
|---|---|---|
| Ukuran stack | ~2 KB (bisa grow) | ~1 MB fixed |
| Pembuatan | Sangat cepat | Relatif lambat |
| Scheduling | Go runtime (M:N) | OS kernel |
| Jumlah | Jutaan | Ribuan |
WaitGroup
Untuk menunggu goroutine selesai, gunakan sync.WaitGroup:
import "sync"
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Printf("Worker %d selesai\n", id)
}(i)
}
wg.Wait() // Tunggu semua goroutine selesai
fmt.Println("Semua selesai!")
}
Catatan Penting
- Goroutine berjalan concurrent (bisa parallel di multi-core)
- Jika
main()selesai, semua goroutine langsung berhenti - Gunakan
sync.WaitGroupatau channel untuk sinkronisasi - Hati-hati dengan race condition — gunakan mutex atau channel untuk shared data