无缓冲channel执行的顺序
package main
import "fmt"
func main() {
done := make(chan int)
go func() {
fmt.Println("你好, 世界")
<-done//这个是接收
}()
done <- 1//这个是发送
}
对于从无缓冲Channel进行的接收,发生在对该Channel进行的发送完成之前。因此,后台线程<-done
接收操作完成之后,main
线程的done <- 1
发送操作才可能完成(从而退出main、退出程序),而此时打印工作已经完成了。
打印->接收->阻塞->发送->退出
接收和发送反一下也可以
package main
import "fmt"
func main() {
done := make(chan int)
go func() {
fmt.Println("你好, 世界")
done <- 1//这个是发送
}()
<-done//这个是接收
}
接收->阻塞->打印->发送->退出
下面是有缓冲
package main
import "fmt"
func main() {
done := make(chan int, 1)
go func() {
fmt.Println("你好, 世界")
<-done//这个是接收
}()
done <- 1//这个是发送
}
如果还这么写就不一定会打印,因为有缓冲,直接就发送了1个,然后main就退出了,反一下
package main
import "fmt"
func main() {
done := make(chan int, 1)
go func() {
fmt.Println("你好, 世界")
done <- 1//这个是发送
}()
<-done//这个是接收
}
在main里因为channel为空,他会等待发送,所以就能打印了
接收->阻塞->打印->发送->退出