- Kênh giao tiếp giữa goroutines.
- Unbuffered channel: block đến khi cả sender và receiver sẵn sàng.
- Buffered: không block nếu buffer chưa đầy.
go
// Tạo channel
ch := make(chan int) // unbuffered
bch := make(chan int, 10) // buffered capacity 10
// Gửi và nhận
go func() {
ch <- 42 // send — block đến khi có receiver
}()
val := <-ch // receive — block đến khi có data
fmt.Println(val) // 42
// Directional channels (best practice)
func producer(out chan<- int) { // chỉ gửi
out <- 1
}
func consumer(in <-chan int) { // chỉ nhận
fmt.Println(<-in)
}
// Close và range
close(ch)
for v := range ch { // tự dừng khi channel đóng
fmt.Println(v)
}