package main
import (
"fmt"
//"time"
)
func main() {
c := make(chan int)
go func() {
fmt.Printf("xxxxx\n")
c <- 1
fmt.Printf("yyyyy\n")
}()
//time.Sleep(time.Second * 1)
fmt.Printf("11111\n")
fmt.Printf("channel output:%d\n", <- c)
fmt.Printf("22222\n")
}
为什么输出的是: 11111 xxxxx yyyyy channel output:1 22222
输出完xxxxx不是得堵塞吗,怎么xxxx输出完之后yyyyy也输出了。加个超时就没问题(time)。
有疑问加站长微信联系(非本文作者)

不带缓冲区的chan 会看是否有因为读该chan而阻塞的goroutine,有可以正常写,如果没有就会阻塞。很明显,fmt.Printf("channel output:%d\n", <- c) 这段代码运行之后 go func() { ... 才执行,所以不会阻塞
@soki 谢谢你
可能说的不太准确,应该是在 <-c 执行之前 会被阻塞在此处 go func c <- 1