专栏首页Golang语言社区39. channel管道 | 厚土Go学习笔记

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

channel 是有类型的管道,channel 的操作符是 <- ,可以用来发送或接收值。
ch <- v    //赋值给管道,管道接收值
v := <- ch    //管道发送值

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

ch := make(chan int)

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

看一个完整的例子

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)
}

运行结果

29 10 39

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

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

ch := make(chan int, 100)

这个通道数量是100。

展示一个有缓冲区的例子

package main

import "fmt"

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

运行结果是

100
5

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

ch <- 100
ch <- 5
ch <- 77

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

fatal error: all goroutines are asleep - deadlock!

本文分享自微信公众号 - Golang语言社区(Golangweb),作者:厚土火焰山

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go语言的管道Channel用法实例

    本文实例讲述了Go语言的管道Channel用法。分享给大家供大家参考。具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其...

    李海彬
  • Go 语言的演化历程

    9、hello.c,标准C89 #include <stdio.h> main(void) //译注:与上面hello.c相比,多了个void { pr...

    李海彬
  • GO-回调函数

    1,什么是回调函数。一个函数中有个参数为函数的指针。该函数自己调用自己指针函数即可; 2,为什么要使用回调函数。抽象画了一个函数,简洁代码。异步执行 3,例子:...

    李海彬
  • 5929 亲戚

    题目描述 Description 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规...

    attack
  • FZU2285 迷宫问题 BFS求最短路-板子题

    Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的...

    用户7727433
  • 【PAT乙级】N-自守数

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • BZOJ4241: 历史研究(回滚莫队)

    如果询问的两个端点在同一个块中,直接暴力计算,时间复杂度$O(\sqrt{n})$

    attack
  • 题目 1159: [偶数求和]

    题目描述 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数(公差为2的等差数列),现在要求你按照顺序每m个数求出一个平均值,如果最后不...

    用户7727433
  • HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/3...

    Angel_Kitty
  • HDU 5536 Chip Factory

    Problem Description John is a manager of a CPU chip factory, the factory produc...

    attack

扫码关注云+社区

领取腾讯云代金券