11.1 channel
一、管道
协程之间的双向通道就是管道
channel语法
func worker(c chan int) { for n := range c { // n := <-c // 接收数据 fmt.Println(n) } } func chanDemo() { // var c chan int // c == nil c := make(chan int) // 创建了channel(管道)之后,需要有goroutine(协程)去接收,不然会造成死锁 go worker(c) c <- 1 // 发送数据1,必须有人收,不然会死掉 c <- 2 // 发送数据2 }注意:
创建了channel(管道)之后,需要有goroutine(协程)去接收,不然会造成死锁
接收数据,可以使用range接收,也可以直接赋值接收
如果将函数提出,可以声明
<-位置声明函数的功能buffered channel语法
func bufferedChannel() { c := make(chan int, 3) // 3表示缓冲区,可以缓冲3个数据 c <- 1 c <- 2 c <- 3 }备注:添加缓存
close
func channelClose() { c := make(chan int) go worker(c) c <- 1 c <- 2 close(c) // 关闭channel }注意:需要生产方关闭,如果不关闭,那么消费发放会一直接收,知道程序结束
理论基础:论文Communication Sequential Process(CSP)
不要通过共享内存来通信;通过通信来共享内存
Last updated
Was this helpful?