Go通道channel通过通信共享内存_第1页
Go通道channel通过通信共享内存_第2页
Go通道channel通过通信共享内存_第3页
Go通道channel通过通信共享内存_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Go通道channel通过通信共享内存目录引言通道的声明与创建接收发送数据

引言

不要通过共享内存来通信应该通过通信来共享内存

这句话有网友的解释如下:

这句俏皮话具体说来就是,不同的线程不共享内存不用锁,线程之间通讯用通道(channel)同步也用channel。

chanel是协程之间传递信息的媒介,优雅地解决了某些后端开发常用语言中随处可见的lock,unlock,临界区等,把从很多线程层面解决的问题移到协程,从而静态地保证没有数据竞争。

通道的声明与创建

伪代码如下:

//声明类型

var通道名chan数据类型

//创建通道

通道名=make(chan数据类型)

实际例子如下:

packagemain

import"fmt"

funcmain(){

varachanint

fmt.Printf("%T,%v\n",a,a)

ifa==nil{

a=make(chanint)

fmt.Printf("%T,%v\n",a,a)

}

运行结果是:

chanint,nil

chanint,0x1400001a360

通道是一个内存地址,这也说明了其实一个引用类型的数据。

接收发送数据

对于同一个通道来讲,他的读数据和写数据都是阻塞的。

伪代码如下:

//从通道读数据

data:=-a

//把数据写入通道

a-data

实际例子如下:

packagemain

import"fmt"

funcmain(){

//首先创建一个bool类型的通道

varch1chanbool

ch1=make(chanbool)

//下面启动一个goroutine

gofunc(){

fori:=0;i10;i++{

fmt.Println("子goroutine中,i:",i)

fmt.Println("completed")

//循环结束后向团队中写数据,表示要结束了

ch1-true

//在主程序中读取数据

data:=-ch1

//打印一下我们读到的数据

fmt.Println("maindata:",data)

fmt.Println("maingoroutinecompleted")

}

运行结果如下:

子goroutine中,i:0

子goroutine中,i:1

子goroutine中,i:2

子goroutine中,i:3

子goroutine中,i:4

子goroutine中,i:5

子goroutine中,i:6

子goroutine中,i:7

子goroutine中,i:8

子goroutine中,i:9

completed

maindata:true

maingoroutinecompleted

我们的子goroutine里面循环打印1~10,打印完成之后把chanel类型的ch1写为true,

这时候,主goroutine就可以根据这一条件进行下一步了,,在此之前,其实就算主goroutine先抢到了资源,从ch1中读取数据,但是现在通道里面啥都没有,只能阻塞,然后乖乖交出资源给我们的子goroutine,直到循环结束写true入ch1。

需要注意的有以下几点:

chanel是需要指定类型的nil类型的chanel不能直接使用。chanel本身是同步的,同一时间只能有一条goroutine进行操作。chanel是goroutine之间传递数据用的,chanel数据的发送和接收必须在不同的goroutine中,如果只有一条goroutine是用不上chanel的,这种情况会发生死锁(deadLock)。从chanel里面读数据立马就会被阻塞,直到有向chanel写数据的goroutine来。向chanel里面写数据立马就会被阻塞,直到有从chanel读数据的goroutine来。

(以上都是相对于没有缓存的通道而

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论