According to Go documentation:
Receivers always block until there is data to receive
This test should fail, because for last receiving operation from a channel there is no corresponding write :
package main
import "fmt"
func main() {
c := make(chan int)
for i := 0; i < 4; i++ { // 4 async reads
go func() {
fmt.Println("received:", <-c)
}()
}
// just 3 writes, 1 write is missing
c <- 1
c <- 2
c <- 3
}
However script not fails with error message in read goroutine, but it succeeds printing 3 values :
received: 1
received: 2
received: 3
Why it is so, or I misunderstood something about synchronization ?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…