这似乎挑战了我对无缓冲通道的理解,即它只能取一个值,然后它会阻止读者阅读它。
下面的代码如何能够写入 3 个值?writeToChan
更令人惊讶的是,尽管顺序不同,但这些值如何可供以后读取?
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
白板的微信
相关分类