Channel — Go

Channel Channel adalah cara utama goroutine berkomunikasi satu sama lain. Prinsip Go: "Do not communicate by sharing memory; instead, share memory by communicat

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)
Diagram komunikasi dua goroutine via unbuffered channel Goroutine A ch <- "halo" (blokir) channel unbuffered Goroutine B v := <-ch (menunggu) Rendezvous: keduanya harus siap bersamaan baru data berpindah dari A ke B Jika B belum siap → A blokir. Jika A belum kirim → B blokir. Inilah yang membuat unbuffered channel menjadi alat sinkronisasi.
Unbuffered channel sebagai alat sinkronisasi: pengirim & penerima bertemu (rendezvous) sebelum data berpindah.

Unbuffered vs Buffered

UnbufferedBuffered
Send memblokir sampai ada receiverSend 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)
}

Yang akan kamu pelajari