A channel carries a value from one job to another. With an unbuffered channel, transfer occurs when sender and receiver meet, so either side may wait for its counterpart.
A buffered channel lets a sender proceed while capacity remains. Sending blocks again when full, so capacity and shutdown behavior need deliberate design.
When to use
Use it to pass values and ownership between jobs instead of mutating shared state directly.