为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中向无缓冲通道写入/读取多个值?

如何在 Go 中向无缓冲通道写入/读取多个值?

Go
慕桂英546537 2022-10-04 17:22:43
这似乎挑战了我对无缓冲通道的理解,即它只能取一个值,然后它会阻止读者阅读它。下面的代码如何能够写入 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个赞

粘贴的摘录的每一行都由您的示例代码证明,如果您了解发生的事件的顺序。

  1. 在 goroutines 启动后,您的主要例程被阻止从通道读取 ,因为它尚未看到要读取的值。例程等待一秒钟,然后再将第一个值写入通道cwriteToChan

  2. 戈鲁廷也被阻塞,因为它正在等待在频道上读取rdFrmChanch

  3. 1 之后,当休眠到期时,第一个写入 () 将首先取消阻止您的主例程,导致值存储在即 42 中writeToChanc <- 42x

  4. 接下来,在下一次写入通道 () 时取消阻止 ,并看到值 27。例程在打印值后终止于此时rdFrmChanc <- 27

  5. 在这一点上,只有价值要写,一个有价值要读。来自戈鲁丁的第三个写入()允许主要例程读取值作为其中的一部分并打印它c <- 9<-ch


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 49 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信