1 . 没有通道缓存,则必须有一个异步并发接受方接受了程序才能走下去
msgChannel := make(chan string)
go func() { msgChannel <- "rungolf" }()
message := <-msgChannel
fmt.Println(message)
主程会一直等待,直到接收到msgChannel中的信息
2 . 没有并发接受方,会发生什么?
msgChannel := make(chan string)
msgChannel <- "run"
fmt.Println(<-msgChannel)
报错:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
E:/go/pass.go:19 +0x51
exit status 2
3 . 通道缓存
msgChannel := make(chan string, 2)
msgChannel <- "run"
fmt.Println(<-msgChannel) //输出run
4 . 通道同步
有时各个协程之间需要同步依赖关系时,可以将使用通道来传递运行情况,让另一端一直等待接受,达到同步效果
package main
import (
"fmt"
"time"
)
func main() {
msgChannel := make(chan bool, 1)
go work(msgChannel)
<-msgChannel //等待,直到通道中有信号返回
fmt.Println("continue")
}
func work(msgChannel chan bool) {
fmt.Println("working")
time.Sleep(time.Second)
fmt.Println("done")
msgChannel <- true //工作完毕,返回信号
}