Channel
Pipa bertipe untuk mengirim dan menerima antar goroutine.
Pahami konsepnya
Tugas bersamaan tidak boleh berbagi variabel seenaknya — hasilnya balapan data yang tak terduga. Channel mengatasinya: make(chan string) membuat pipa bertipe, dan operator <- mengirim di satu sisi serta menerima di sisi lain.
Channel tanpa buffer bersifat sinkron: pengiriman menunggu sampai ada penerima, dan penerimaan menunggu sampai ada pengirim. Kedua sisi berjabat tangan — kamu tahu persis saat data berpindah. Ini sekaligus menjadi titik tunggu alami: main yang menerima <-ch otomatis menunggu goroutine selesai mengirim.
Fungsi main adalah goroutine; bila ia selesai lebih dulu seluruh program berhenti. Menerima dari channel menahan main tepat selama dibutuhkan — inilah mengapa contoh klasik goroutine + channel tidak memerlukan Sleep sama sekali.
Coba contoh kode
package main
import "fmt"
func pesan(nama string, ch chan string) {
ch <- "Halo dari " + nama
}
func main() {
ch := make(chan string)
go pesan("goroutine", ch)
fmt.Println(<-ch)
}go pesan(...) memulai tugas baru, dan penerimaan <-ch memblokir main sampai nilai tiba — tidak perlu Sleep, tidak ada balapan. Setelah diterima, program berakhir dengan seluruh goroutine diam. Hilangkan baris penerimaan lalu jalankan beberapa kali: kadang pesan muncul, kadang tidak.
Dua arah data
func pekerja(tugas chan string, hasil chan int) {
nama := <-tugas // terima pekerjaan
hasil <- len(nama) // kirim hasil
}
func main() {
tugas := make(chan string)
hasil := make(chan int)
go pekerja(tugas, hasil)
tugas <- "concURRENCY" // kirim pekerjaan
fmt.Println(<-hasil) // 10
}Channel dua arah seperti percakapan: main mengirim pekerjaan, pekerja menerima, mengolah, lalu mengirim balik hasil. Setiap panah <- adalah titik jeda yang menjaga kedua goroutine selangkah — pola ini adalah cetakan semua arsitektur worker di Go.
Latihan singkat
Uji: dua goroutine mengirim kuadrat 3 dan 9 ke satu channel; terima keduanya dan cetak jumlahnya — harus persis `90`.