这似乎挑战了我对无缓冲通道的理解,即它只能取一个值,然后它会阻止读者阅读它。下面的代码如何能够写入 3 个值?writeToChan更令人惊讶的是,尽管顺序不同,但这些值如何可供以后读取?https://golang.org/doc/effective_go#channels 节选接收方总是阻塞,直到有数据要接收。如果通道未缓冲,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方仅在将值复制到缓冲区之前才会阻塞;如果缓冲区已满,则意味着要等到某个接收方检索到值。package mainimport ( "fmt" "time")func main() { ch := make(chan int) go writeToChan(ch) go rdFrmChan(ch) x := <- ch fmt.Println("main read 1 -:",x) fmt.Println("main read 2 -:",<-ch)}func writeToChan(c chan int) { time.Sleep(time.Second * 1) c <- 42 c <- 27 c <- 9}func rdFrmChan(c chan int) { fmt.Println("Go routine read :", <-c)}输出:去常规阅读:27主要阅读1 -: 42主要阅读2 -:9Playground link: https://play.golang.org/p/DYzfYh-kXnC
1 回答
白板的微信
TA贡献1883条经验 获得超3个赞
粘贴的摘录的每一行都由您的示例代码证明,如果您了解发生的事件的顺序。
在 goroutines 启动后,您的主要例程被阻止从通道读取 ,因为它尚未看到要读取的值。例程等待一秒钟,然后再将第一个值写入通道
c
writeToChan
戈鲁廷也被阻塞,因为它正在等待在频道上读取
rdFrmChan
ch
1 之后,当休眠到期时,第一个写入 () 将首先取消阻止您的主例程,导致值存储在即 42 中
writeToChan
c <- 42
x
接下来,在下一次写入通道 () 时取消阻止 ,并看到值 27。例程在打印值后终止于此时
rdFrmChan
c <- 27
在这一点上,只有价值要写,一个有价值要读。来自戈鲁丁的第三个写入()允许主要例程读取值作为其中的一部分并打印它
c <- 9
<-ch
- 1 回答
- 0 关注
- 49 浏览
添加回答
举报
0/150
提交
取消