Channels by default accept a single send (<-) if there is a receive. They are unbuffered. A buffer is like a memory, multiple items can be put in a buffer.
Channels usually are synchronous. Both sides (goroutines) need to be ready for sending or receiving. Not so with buffered channels, they are asynchronous.
Go supports channels that have a buffer, buffered channels.
A buffered channel (named c) can be created with the line:
var c chan string = make(chan string,3).
The second parameter is the capacity. This will create a buffer with a capacity of 3.
Then multiple messages can be stored using
c <- message. If you want to output a channel element, you can use the line
$ go run example.go hello world go
Because this channel is buffered, you can store values without a having another goroutine to save them immediately.