package main import ( "fmt" "time" ) func main() { // Unbuffered channel messageChannel := make(chan string) // Buffered channel bufferedChannel := make(chan int, 2) fmt.Println("--- Non-blocking read from unbuffered channel ---") select { case msg := <-messageChannel: fmt.Printf("Received message: %s ", msg) default: fmt.Println("No message available immediately (unbuffered channel).") } fmt.Println(" --- Non-blocking write to unbuffered channel ---") select { case messageChannel <- "hello": fmt.Println("Sent message: hello") default: fmt.Println("Could not send message immediately (unbuffered channel, no receiver).") } // Start a receiver for the unbuffered channel go func() { time.Sleep(100 * time.Millisecond) // Simulate some delay msg := <-messageChannel fmt.Printf("Goroutine received: %s ", msg) }() // Try sending again after a short delay (receiver might be ready) time.Sleep(50 * time.Millisecond) fmt.Println(" --- Non-blocking write to unbuffered channel (retry with receiver) ---") select { case messageChannel <- "world": fmt.Println("Sent message: world") default: fmt.Println("Could not send message immediately (unbuffered channel, receiver not ready yet).") } // Give time for the receiver goroutine to finish time.Sleep(100 * time.Millisecond) fmt.Println(" --- Non-blocking write to buffered channel ---") select { case bufferedChannel <- 1: fmt.Println("Sent 1 to buffered channel.") default: fmt.Println("Buffered channel is full, could not send 1.") } select { case bufferedChannel <- 2: fmt.Println("Sent 2 to buffered channel.") default: fmt.Println("Buffered channel is full, could not send 2.") } select { case bufferedChannel <- 3: // This will fail as capacity is 2 fmt.Println("Sent 3 to buffered channel.") default: fmt.Println("Buffered channel is full, could not send 3 (expected).") } fmt.Println(" --- Non-blocking read from buffered channel ---") select { case val := <-bufferedChannel: fmt.Printf("Read %d from buffered channel. ", val) default: fmt.Println("Buffered channel is empty, no value to read.") } select { case val := <-bufferedChannel: fmt.Printf("Read %d from buffered channel. ", val) default: fmt.Println("Buffered channel is empty, no value to read.") } select { // This will now hit default case val := <-bufferedChannel: fmt.Printf("Read %d from buffered channel. ", val) default: fmt.Println("Buffered channel is empty, no value to read (expected). ") } close(messageChannel) close(bufferedChannel) fmt.Println("Main: Exiting.") }