By default push operations to golang channel will block once the channel is full and wait that an other go routine will consume a message from the channel.
The following example will block after 3 messages queued in the channel, and since no other go routine is running it will crash with a dead lock error:
package main
import "fmt"
func main() {
ch := make(chan string, 3)
for i := 0; i < 10; i++ {
ch <- "hello"
fmt.Println("Pushed a message to the channel")
}
}
To avoid blocking the execution of your application you can handle the case of a full channel by using select:
package main
import "fmt"
func main() {
ch := make(chan string, 3)
for i := 0; i < 10; i++ {
select {
case ch <- "hello":
fmt.Println("Pushed a message to the channel")
default:
fmt.Println("WARN: The channel is full")
}
}
}
This way you can easily decide to ignore the message or handle this problem an other way than blocking the current go routine.
Top comments (0)