【go系列5】golang中的通道

鬼子母
• 阅读 3207

golang中的通道类型是一种特殊的类型, 类型名字为chan。在任何时候,同时只有一个goroutine访问通道进行并发和获取数据,goroutine间通过通道就可以进行通信。我们可以通过go关键字创建goroutine。
通道本身是同步的,通道的发送和接受数据默认是同步的,且遵循先进先出的规则以保证数据发送的顺序。

  1. 通道分为双向通道和单向通道。
  • 双向通道:
chan1 := make(chan int, 10)
  • 单向通道:
#单向只写通道,10 表示通道的容量
chan2 := make(chan <- int, 10)
#单向只读通道,10表示通道的容量
chan3 := make(<- chan int, 10)
package main

import (
    "time"

    "github.com/golang/glog"
)

func read(readChan <-chan int) {
    for data := range readChan {
        glog.Info(data)
    }
}

func write(writeChan chan<- int) {
    for i := 0; i < 100; i++ {
        writeChan <- i
        glog.Infof("write: %s", i)
    }
}

func main() {
    // 双向通道
    writeReadChan := make(chan int)
    // 传入双向通道自动会转换成一个单项通道
    go write(writeReadChan)
    glog.Info("start to read data from channel!")
    // 传入双向通道会自动转换成一个单项通道`
    go read(writeReadChan)
    // 关闭chan
    close(writeReadChan)
    time.Sleep(time.Second * 100)
    glog.Info("finishedAll!!")

}
  1. 通道分无缓冲通道和缓冲通道
  • 无缓冲通道
unbufferChan1 := make(chan int)
unbufferChan2 := make(chan int, 0)
  • 缓冲通道
bufferChan := make(chan int, 1)
  • 无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景:

    1. 通道中无数据,但执行读通道。
    2. 通道中无数据,向通道写数据,但无协程读取。
func occasion1() {
    noBufChan := make(chan int)
    <-noBufChan
    fmt.Println("read ")
}

// 场景2
func occasion2() {
    ch := make(chan int)
    ch <- 1
    fmt.Println("write success no block")
}
  • 有缓存通道的特点是,有缓存时可以向通道中写入数据后直接返回,缓存中有数据时可以从通道中读到数据直接返回,这时有缓存通道是不会阻塞的,它阻塞场景是:

    1. 通道的缓存无数据,但执行读通道。
    2. 通道的缓存已经占满,向通道写数据,但无协程读。
// 场景1
func occasion1() {
    bufCh := make(chan int, 2)
    <-bufCh
    fmt.Println("read from no buffer channel success")
}

// 场景2
func occasion2() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    ch <- 3
    fmt.Println("write success no block")
}
点赞
收藏
评论区
推荐文章
仲远 仲远
2年前
Airtool for Mac(系统菜单栏网络工具)
AirtoolMac版是一款Mac系统菜单栏网络工具软件,AirtoolMac版为用户提供检查内置WiFi适配器的状态和通道配置的基本功能,以及在单通道和多通道上执行帧捕获。安装软件:轻松捕获帧允许您捕获单个或多个通道并自动启动Wireshark。使用您最
Stella981 Stella981
3年前
Fabric多通道网络实战
HyperledgerFabric支持在一组相同的机构之间的多通道部署,每个通道都相当于一个单独的区块链。Fabric的多通道特性不仅可以满足机构之间不同的数据共享需求,同时也可以提高整个Fabric网络的吞吐量。本文将演示如何使用HyperledgerFabric1.4.3搭建一个多通道的区块链网络、部署并访问链码。1、HyperledgerF
Wesley13 Wesley13
3年前
JAVA NIO(一)
1NIO概述1.1NIO(newIO)是一个可以替代javaIOAPI的API,NIO提供了与标准IO不同的工作方式,标准IO是基于字节流和字符流进行操作的,而NIO是基于channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写到通道中,方式如例图示,JAVANIO的几个核心组成部分是channels,Buf
Wesley13 Wesley13
3年前
NIO通道(channel)原理与获取
一、通道(Channel):用于源节点与目标节点的连接。在javaNIO中负责缓冲区中数据的传输。Channel本身不存储数据,因此需要配合缓冲区进行传输。二、通道的主要实现类java.nio.channels.Channel接口:|–FileChannel|–SocketChannel|–ServerSocketCha
Wesley13 Wesley13
3年前
Java NIO系列教程(五) 通道之间的数据传输
在JavaNIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。transferFrom()FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解
Wesley13 Wesley13
3年前
Java Nio
(1)NIOa)  Nio之所以比旧的io速度快是因为,nio使用的结构更接近于系统操作执行io的操作:通道和缓冲器.(2)如何操作nio读写数据Nio读写方式可以想象成:数据源和数据目的地是煤矿与煤场,通道想象成告诉公路,缓冲器是卡车,nio中的FileChannel是装卸煤用的工具,ByteBuffer是装煤用的卡车.在新的io中我们不对通道
可莉 可莉
3年前
08. Java NIO FileChannel 文件通道
JavaNIO中的FileChannel是用于连接文件的通道。通过文件通道可以读、写文件的数据。JavaNIO的FileChannel是相对标准JavaIOAPI的可选接口。FileChannel不可以设置为非阻塞模式,他只能在阻塞模式下运行。打开文件通道(OpeningaFileChannel)
Stella981 Stella981
3年前
Golang学习笔记:channel
channelchannel是goroutine之间的通信机制,它可以让一个goroutine通过它给另一个goroutine发送数据,每个channel在创建的时候必须指定一个类型,指定的类型是任意的。使用内置的make函数,可以创建一个channel类型:ch:make(chanint)发送和接
Stella981 Stella981
3年前
OpenCV访问像素点
三种方法迭代器创建一个Mat::Iterator对象it,通过itMat::begin()来的到迭代首地址,递增迭代器知道itMat::end()结束迭代;while(it!Scr.end<Vec3b()){//(it)00;//蓝色通道置零;
Stella981 Stella981
3年前
RTSP协议网页无插件直播平台EasyNVR视频广场无法搜索纯数字关键词的通道,该如何解决的?
最近改版的新版EasyNVR我们发现界面中仍然保留了“视频广场”的显示项,通过视频广场可以查看不同通道的最新视频快照信息,也可以通过搜索方式展现特定的视频通道快照。最近测试中研发测试时,发现在视频广场使用搜索框搜索不到纯数字的关键词。!NVR10.png(https://imgconvert.csdnimg.cn/aHR0cDovLzEyMS40MC
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(