当前位置: 首页 > news >正文

有哪些搜索引擎网站开封市建设中专网站

有哪些搜索引擎网站,开封市建设中专网站,网页制作与网站建设实战大全 pdf下载,wordpress首页自定义缩略图大小通道类型的值本身就是并发安全的#xff0c;这也是Go语言自带的、唯一一个可以满足并发安全性的类型。 声明一个通道类型变量的时候#xff0c;我们首先要确定该通道类型的元素类型#xff0c;决定了我们可以通过这个通道传递什么类型的数据。 在初始化通道的时候#xf…通道类型的值本身就是并发安全的这也是Go语言自带的、唯一一个可以满足并发安全性的类型。 声明一个通道类型变量的时候我们首先要确定该通道类型的元素类型决定了我们可以通过这个通道传递什么类型的数据。 在初始化通道的时候make函数除了必须接收这样的类型字面量作为参数还可以接收一个int类型的参数。 后者是可选的用于表示该通道的容量。通道的容量就是指通道最多可以缓存多少个元素值。由此虽然这个参数是int类型的但是它是不能小于0的。 当容量为0时我们可以称通道为非缓冲通道也就是不带缓冲的通道。当容量大于0时我们可以称为缓冲通道也就是带有缓冲的通道。非缓冲通道和缓冲通道有着不同的数据传递方式。 一个通道相当于一个先进先出FIFO的队列。也就是说通道中的各个元素值都是严格地按照发送的顺序排列的先被发送通道的元素值一定会先被接收。元素值的发送和接收都需要用到操作符-。我们也可以叫它接送操作符。一个左尖括号紧接着一个减号形象地代表了元素值的传输方向。 package mainimport fmtfunc main() {ch1 : make(chan int, 3)ch1 - 2ch1 - 1ch1 - 3elem1 : -ch1fmt.Printf(The first element received from channel ch1: %v\n,elem1) }上面代码中声明并初始化了一个元素类型为int、容量为3的通道ch1并用了三条语句向该通道先后发送了三个元素值2、1和3. 这里的语句需要这样写依次敲入通道变量的名称比如ch1、接送操作符-以及想要发送的元素值比如2并且这三者之间最好用空格进行分割。 这显然表达了“这个元素值将被发送该通道”这个语义。由于该通道的容量为 3所以我可以在通道不包含任何元素值的时候连续地向该通道发送三个值此时这三个值都会被缓存在通道之中。 当我们需要从通道接收元素值的时候同样要用接送操作符-只不过这时需要把它写在变量名的左边用于表达“要从该通道接收一个元素值”的语义。 如果我们需要把如此得来的元素值存起来那么在接收表达式的左边就需要依次添加赋值符号或:和用于存值的变量的名字。因此语句elem1 : -ch1会将最先进入ch1的元素2接收来并存入变量elem1。 对通道的发送和接收操作都有哪些基本的特性 1.对于同一个通道发送操作之间是互斥的接收操作之间也是互斥的。 2.发送操作和接收操作中对元素值的处理都是不可分割的。 3.发送操作在完全完成之前会被阻塞。接受操作也是如此。 问题详解 1.对于同一个通道发送操作之间是互斥等待接收操作之间也是互斥的。 在同一时刻Go语言的运行时系统以下简称运行时系统只会执行对同一个通道的任意个发送操作中的某一个。 直到这个元素值完全被移出该通道之后其他针对该通道的接收操作才可能被执行。即使这些操作是并发执行的也是如此。 另外对于通道的同一个元素值来说发送操作和接收操作之间也是互斥的。例如虽然会出现正在被复制进通道但未复制完成的元素值但是这时它绝不会被想接收它的一方看到和取走。 需要注意的细节是元素值从外界进入通道时会被复制。更具体地说进入通道的并不是在接收操作符右边的那个元素值而是它的副本。 另一方面元素值从通道进入外界时会被移动。这个移动操作实际上包含了两步第一步是生成正在通道中的这个元素值的副本并准备给到接收方第二步是删除在通道中的这个元素值。 2.发送操作和接收操作中对元素值的处理都是不可分割的。 这里的不可分割的意思是它们处理元素值时都是一气呵成的绝不会被打断。 例如发送操作要么还没复制元素值要么已经复制完毕绝不会出现只复制了一部分的情况。 又例如接收操作在准备好元素值的副本之后一定会删除掉通道中的原值绝不会出现通道中仍有残留的情况。 这既是为了保证通道中元素值的完整性也是为了保证通道操作的唯一性。对于通道中的同一个元素值来说它只可能是某一个发送操作放入的同时也只可能被某一个接收操作取出。 3.发送操作在完全完成之前会被堵塞。接收操作也是如此 发送操作包括了复制元素值和放置副本到通道内部这两个步骤。 在这两个步骤完全完成之前发起这个发送操作的那句代码会一直堵塞在那里。也就是说在它之后的代码不会有执行的机会直到这句代码的阻塞解除。 更细致地说在通道完成发送操作之后运行时系统会通知这句代码所在的goroutine以使它去争取继续运行代码的机会。 接收操作通常包含了复制通道内的元素值放置副本到接收方删除原值三个步骤。 在所有这些步骤完全完成之前发起该操作的代码也会一直阻塞直到该代码所在的goroutine收到了运行时系统的通知并重新获得运行机会为止。 如此阻塞代码其实就是为了实现操作的互斥和元素值的完整。 发送操作和接收操作在什么时候可能被长时间的阻塞 缓冲通道 针对缓冲通道的情况。如果通道已满那么对它的所有发送操作都会被阻塞直到通道中有元素值被接收走。 这时通道会优先通知最早因此而等待的、那个发送操作所在的goroutine后者会再次执行发送操作。 由于发送操作在这种情况下被阻塞后它们所在的goroutine会顺序地进入通道内部的发送等待队列所以通知的顺序总是公平的。 相对的如果通道已空那么对它的所有接收操作都会被阻塞直到通道中有新的元素值出现。这时通道会通知最早等待的那个接收操作所在的goroutine并使它再次执行接收操作。 因此而等待的、所有接收操作所在的goroutine都会按照先后顺序被放入通道内部的接收等待队列。 非缓冲通道 对应非缓冲通道情况要简单一点。无论是发送操作还是接收操作一开始执行就会被阻塞直到配对的操作也开始执行才会继续传递。由此可见非缓冲通道是在用同步的方式传递数据。也就是说只有收发双方对接上了数据才会被传递。 并且数据是直接从发送方复制到接收方的中间并不会用非缓冲通道做中转。相比之下缓冲通道则在用异步的方式传递数据。 在大多数情况下缓冲通道会作为收发双方的中间件。正如前文所述元素值会先从发送方复制到缓冲通道之后再由缓冲通道复制给接收方。 但是当发送操作在执行的时候发现空的通道中正好有等待的接收操作那么它会直接把元素值复制给接收方。 注意 对于值为nil的通道不论它的具体类型是什么对它的发送操作和接收操作都会永久地处于阻塞状态。它们所属的goroutine中的任何代码都不再会被执行。 由于通道类型是引用类型所以它的零值就是nil。换句话说当我们只声明该类型的变量但没有用make函数对它进行初始化时该变量的值就会是nil。所以一定不要忘记初始化通道 发送操作和接收操作在什么时候会引发panic 对于一个已初始化但未来关闭的通道来说收发操作一定不会引发panic。但是通道一旦关闭再对它进行发送操作就会引发panic。 当我们把接收表达式的结果同时赋给两个变量时第二个变量的类型就是一定bool类型。它的值如果为false就说明通道已经关闭并且再没有元素值可取了。 注意如果通道关闭时里面还有元素值未被取出那么接收表达式的第一个结果仍会是通道中的某一个元素值而第二个结果值一定会是true。 因此通过接收表达式的第二个结果值来判断通道是否关闭是可能有延时的。 文章学习自郝林老师的《Go语言36讲》
http://www.huolong8.cn/news/151313/

相关文章:

  • 线上培训机构排名前十佛山网站seo
  • 学校部门网站建设情况汇报桐城市美丽乡村建设专题网站
  • 网站建设与推广 范文长沙人才招聘网
  • 软件项目管理论文3000字搜索引擎优化的方法有哪些?
  • asp.net mvc5网站开发之美 pdf做网站总结作文
  • 网站建设页面设计规格设计公司网站运营
  • 建站网站和维护需要会什么区别net域名做企业网站怎么样
  • 保亭住房和城乡建设局网站微信小程序开发者工具官网下载
  • 做网站 php asp.net jsp做网站标签栏的图片大小
  • 临沂网站建设公司单位网站建设费算无形资产吗
  • 哪里能做网站一网一平台是什么
  • 用vue做商城网站常用的js展览展会公司
  • 网站右侧浮动窗口网站建设评比标准
  • 如何用图片做网站背景app定制小程序开发
  • 移动版网站建设的必要性wordpress 新增选项
  • 重庆网站公司设计方案做网站抬头
  • 做ar的网站网页素材提取
  • 网站开发部门的规章制度中介网站设计
  • 网站开发技术 难点网站开发工资淄博
  • 中山民众网站建设做什么网站比较受欢迎
  • c 做网站优点昆明网页设计公司排行榜
  • 网站建设及目标建设摩托车官网官方网站
  • 关于设计网站自动注册wordpress账号软件
  • 广州网站开发招聘信息ui是什么
  • 做网站怎样收费的如何做一家门户网站
  • seo怎么做网站的tdk建设大型网站怎样赢利
  • 如何制作个人手机网站做站群的网站怎么来
  • 可以做手机网页的网站关键词点击排名软件
  • 做个网页需要多少钱?六安seo地址
  • 管理外贸网站模板下载设计衣服网站