Select prints output from only one channel

Issue

I am learning Go and I am on channels now. I have written a simple program using channels. I have created two channels and the channels are passed to a function which is called concurrently.

My expectation is to print output form both the channels but in reality only one channel output is getting printed:

package main

import "fmt"

func square(dat int, ch chan<- int) {

    ch <- dat * dat

}

func main() {

    resp1 := make(chan int)
    resp2 := make(chan int)

    go square(20, resp1)
    go square(10, resp2)

    select {
    case msg1 := <-resp1:
        fmt.Println(msg1)
    case msg2 := <-resp2:
        fmt.Println(msg2)
    }
}

Either the message from resp1 is printed or that from resp2 during each execution. Channels should block until something is pushed into it, right?

Solution

The Go Programming Language Specification

Select statements

A “select” statement chooses which of a set of possible send or
receive operations will proceed.

Select chooses one of a set. For example,

package main

import "fmt"

func square(dat int, ch chan<- int) {

    ch <- dat * dat

}

func main() {

    resp1 := make(chan int)
    resp2 := make(chan int)

    go square(20, resp1)
    go square(10, resp2)

    // Choose one
    select {
    case msg1 := <-resp1:
        fmt.Println(msg1)
    case msg2 := <-resp2:
        fmt.Println(msg2)
    }
    // Choose the other
    select {
    case msg1 := <-resp1:
        fmt.Println(msg1)
    case msg2 := <-resp2:
        fmt.Println(msg2)
    }
}

Playground: https://play.golang.org/p/TiThqcXDa6o

Output:

100
400

Answered By – peterSO

Answer Checked By – Clifford M. (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.