- 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)
}Channels are the communication mechanism between goroutines.
An unbuffered channel blocks until both sides are ready; a buffered channel does not block while buffer is not full.
go
// Create channels
ch := make(chan int) // unbuffered
bch := make(chan int, 10) // buffered, capacity 10
// Send and receive
go func() {
ch <- 42 // send — blocks until a receiver is ready
}()
val := <-ch // receive — blocks until data arrives
fmt.Println(val) // 42
// Directional channels (best practice)
func producer(out chan<- int) { // send-only
out <- 1
}
func consumer(in <-chan int) { // receive-only
fmt.Println(<-in)
}
// Close and range
close(ch)
for v := range ch { // stops automatically when channel is closed
fmt.Println(v)
}