猿问

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

这似乎挑战了我对无缓冲通道的理解,即它只能取一个值,然后它会阻止读者阅读它。

  1. 下面的代码如何能够写入 3 个值?writeToChan

  2. 更令人惊讶的是,尽管顺序不同,但这些值如何可供以后读取?

https://golang.org/doc/effective_go#channels 节选

接收方总是阻塞,直到有数据要接收。如果通道未缓冲,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方仅在将值复制到缓冲区之前才会阻塞;如果缓冲区已满,则意味着要等到某个接收方检索到值。

package main


import (

    "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 -:9



Playground link: https://play.golang.org/p/DYzfYh-kXnC


慕桂英546537
浏览 64回答 1
1回答

白板的微信

粘贴的摘录的每一行都由您的示例代码证明,如果您了解发生的事件的顺序。在 goroutines 启动后,您的主要例程被阻止从通道读取 ,因为它尚未看到要读取的值。例程等待一秒钟,然后再将第一个值写入通道cwriteToChan戈鲁廷也被阻塞,因为它正在等待在频道上读取rdFrmChanch1 之后,当休眠到期时,第一个写入 () 将首先取消阻止您的主例程,导致值存储在即 42 中writeToChanc <- 42x接下来,在下一次写入通道 () 时取消阻止 ,并看到值 27。例程在打印值后终止于此时rdFrmChanc <- 27在这一点上,只有价值要写,一个有价值要读。来自戈鲁丁的第三个写入()允许主要例程读取值作为其中的一部分并打印它c <- 9<-ch
随时随地看视频慕课网APP

相关分类

Go
我要回答