Concept Flow - Buffered and unbuffered channels
Create channel
Send data
Unbuffered?
Wait receiver
Receiver ready
Data received
Shows how data is sent and received differently in unbuffered and buffered channels.
ch := make(chan int) // unbuffered // goroutine to send go func() { ch <- 42 }() // main goroutine receives val := <-ch
| Step | Action | Channel State | Sender Blocked? | Receiver Blocked? | Output |
|---|---|---|---|---|---|
| 1 | Create unbuffered channel | empty | No | No | |
| 2 | Send 42 to channel | empty (waiting for receiver) | Yes | No | |
| 3 | Receive from channel | empty | No | No | 42 |
| 4 | Send completes | empty | No | No | 42 |
| 5 | Program ends | empty | No | No | 42 |
| Variable | Start | After Step 2 | After Step 3 | Final |
|---|---|---|---|---|
| ch (channel) | empty | waiting for receiver | empty | empty |
| val (received) | undefined | undefined | 42 | 42 |
Channels in Go can be unbuffered or buffered. Unbuffered channels block the sender until the receiver is ready. Buffered channels store values up to their capacity without blocking. Use make(chan Type, capacity) to create buffered channels. Send blocks if buffer is full; receive blocks if buffer is empty.