《Go memory model》中的定义:A receive from an unbuffered channel happens before the send on that channel completes.
这句话怎么理解?为何channel关闭之后
case:<-ch:……
分支一直执行
func main() {
ch := make(chan string)
go sendData(ch)
go recvData(ch)
time.Sleep(2*1e9)
}
func sendData(ch chan string) {
time.Sleep(1e9)
close(ch)
}
func recvData(ch chan string) {
for {
select {
case <-ch:
fmt.Println("Closed")
default:
fmt.Println("ing")
time.Sleep(1e8)
}
}
}
而使用
func recvData(ch chan string) {
for {
select {
case <-ch:
fmt.Println("Closed")
select{}
default:
fmt.Println("ing")
time.Sleep(1e8)
}
}
}
则case:<-ch:……
分支只会执行一次。
http://dave.cheney.net/tag/golang-3
A closed channel never blocks
http://dave.cheney.net/2014/03/19/channel-axioms
A receive from a closed channel returns the zero value immediately