前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >39. channel管道 | 厚土Go学习笔记

39. channel管道 | 厚土Go学习笔记

作者头像
李海彬
发布2018-03-19 14:38:18
5480
发布2018-03-19 14:38:18
举报
文章被收录于专栏:Golang语言社区Golang语言社区
channel 是有类型的管道,channel 的操作符是 <- ,可以用来发送或接收值。
代码语言:javascript
复制
ch <- v    //赋值给管道,管道接收值
v := <- ch    //管道发送值

管道的使用也是必须创建的。创建的方式是

代码语言:javascript
复制
ch := make(chan int)

管道默认情况下,在另一端准备好之前,发送和接收都会堵塞。这使得 goroutine 可以在没有明确的锁的情况下进行同步。

看一个完整的例子
代码语言:javascript
复制
package main

import "fmt"

func sum(a []int, c chan int)  {
    sum := 0
    for _, v := range a{
        sum += v
    }
    c <- sum
}
func main() {
    a := []int{2, 0, 1, 7, 0, 8, 2, 7, 1, 7, 4}
    c := make(chan int)
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
    x, y := <-c, <-c
    fmt.Println(x, y, x + y)
}

运行结果

代码语言:javascript
复制
29 10 39

channel 是可以设置缓冲的,向有缓冲的 channel 发送数据的时候,在缓冲区满的时候才会阻塞。而当缓冲区为空的时候,接收操作会阻塞。

设置 channel 缓冲通道数量的方式如下

代码语言:javascript
复制
ch := make(chan int, 100)

这个通道数量是100。

展示一个有缓冲区的例子
代码语言:javascript
复制
package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 100
    ch <- 5
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

运行结果是

代码语言:javascript
复制
100
5

本例设置了缓冲数为 2。意思是在一个 goroutine 里可以有两个传值操作,在通道值被接收前通道会被占满。如果有第三个值传入通道会发生失败。

代码语言:javascript
复制
ch <- 100
ch <- 5
ch <- 77

增加一个传入值,再运行看看,会得到如下结果

代码语言:javascript
复制
fatal error: all goroutines are asleep - deadlock!
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 看一个完整的例子
  • 展示一个有缓冲区的例子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档