2 回答
TA贡献1936条经验 获得超6个赞
让我们逐步完成第一个程序:
// My notes here
ch := make(chan int) // make a new int channel
ch <- 1 // block until we can send to that channel
// keep blocking
// keep blocking
// still waiting for a receiver
// no reason to stop blocking yet...
// this line is never reached, because it blocks above forever.
fmt.Println(<-ch)
第二个程序将发送拆分到它自己的执行行中,所以现在我们有:
ch := make(chan int) // make a new int channel
go func () { // start a new line of execution
ch <- 1 // block this second execution thread until we can send to that channel
}()
fmt.Println(<-ch) // block the main line of execution until we can read from that channel
由于这两条执行线可以独立工作,因此主线可以下到通道fmt.Println并尝试从通道接收。第二个线程将等待发送直到发送完毕。
TA贡献1785条经验 获得超4个赞
go 例程绝对有所作为。写入通道的 go 例程将被阻塞,直到您的主函数准备好从 print 语句中的通道读取。有两个并发线程,一个读取,一个写入,满足双方的准备工作。
在您的第一个示例中,单个线程被通道写入语句阻塞,并且永远不会到达通道读取。
您需要有一个并发的 go 例程,以便在您写入通道时从通道中读取。并发与通道使用密切相关。
- 2 回答
- 0 关注
- 106 浏览
添加回答
举报