While playing with Go's channels and routines, I came across special behaviors that I was hoping someone could explain.
Below is a short program that should print a couple of lines in stdout by sending lines through a pipe to a "listener" (select statement), which works in a separate version of goroutine.
package main import ( "fmt" "time" ) func main() { a := make(chan string) go func() { for { select { case <-a: fmt.Print(<-a) } } }() a <- "Hello1\n" a <- "Hello2\n" a <- "Hello3\n" a <- "Hello4\n" time.Sleep(time.Second) }
Using
go func() { for s := range a { fmt.Print(s) } }()
works as expected. However, running the topmost fragment using the select statement leads to the following output:
Hello2 Hello4
i.e. only every other expression is printed. What witchcraft is this?
source share