← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 26

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`.