Channel
Channel adalah cara utama goroutine berkomunikasi satu sama lain. Prinsip Go: "Do not communicate by sharing memory; instead, share memory by communicating."
Membuat Channel
// Unbuffered channel
ch := make(chan string)
// Buffered channel (kapasitas 5)
ch2 := make(chan int, 5)
Mengirim dan Menerima
ch := make(chan string)
// Goroutine mengirim data
go func() {
ch <- "Halo dari goroutine!"
}()
// Main menerima data
pesan := <-ch
fmt.Println(pesan)
Unbuffered vs Buffered
| Unbuffered | Buffered |
|---|---|
| Send memblokir sampai ada receiver | Send memblokir hanya jika buffer penuh |
| Sinkron (rendezvous) | Asinkron (sampai buffer penuh) |
make(chan int) | make(chan int, 10) |
Channel Direction
// Hanya bisa mengirim
func producer(ch chan<- string) {
ch <- "data"
}
// Hanya bisa menerima
func consumer(ch <-chan string) {
data := <-ch
fmt.Println(data)
}
Range dan Close
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch) // Tutup channel setelah selesai
}()
// Range otomatis berhenti saat channel ditutup
for val := range ch {
fmt.Println(val)
}
Pattern: Fan-Out / Fan-In
// Multiple goroutine menulis ke satu channel
results := make(chan int)
for i := 0; i < 3; i++ {
go func(id int) {
results <- id * 10
}(i)
}
for i := 0; i < 3; i++ {
fmt.Println(<-results)
}