解锁即可观看《Go开发工程师》完整课程视频

Go开发工程师

未来3-5年企业高性能项目不可替代的语言,从基础到项目实战再到重构,真正从入门到精通

【第1周】Go基础知识入门
【第2周】容器,go编程思想
【第3周】Go并发编程和工程管理
【第4周】从0开始理解rpc和grpc
【第5周】grpc和protobuf进阶
【第6周】 yapi文档管理、gorm详解
【第7周】gin快速入门
【第8周】用户服务的grpc服务
【第9周】用户服务的web服务
【第10周】服务注册/发现、配置中心、负载均衡
【第11周】商品微服务的grpc服务
【第12周】 商品微服务的gin层和oss图片服务
【第13周】库存服务和分布式锁
【第14周】订单和购物车微服务
【第15周】 支付宝支付、用户操作微服务、前后端联调
【第16周】elasticsearch实现搜索微服务
【第17周】 分布式理论基础、分布式事务解决方案
【第18周】 学习rocketmq实现幂等性机制等
【第19周】链路追踪、限流、熔断、降级
【第20周】api网关、部署
【第21周】开发规范和go基础扩展
【第22周】设计模式和单元测试
【第23周】protoc插件开发、cobra命令行
【第24周】log日志包设计
【第25周】ast代码生成工具开发
【第26周】三层代码结构
【第27周】grpc服务封装更方便的rpc服务
【第28周】深入grpc的服务注册、负载均衡原理
【第29周】基于gin封装api服务
【第30周】可观测的终极解决方案
【第31周】系统监控核心
【第32周】用户、商品服务重构
【第33周】订单、库存等服务重构
【第33+周】订单服务重构、wire进行ioc控制
【第34周】通过k8s部署服务
【第34+周】devops和k8s
章节
问答
课签
笔记
评论
占位
占位

Go语言-通道类型

    通道(Channel)是Go语言中一种非常独特的数据结构。它可用于在不同Goroutine之间传递类型化的数据,并且是并发安全的。相比之下,我们之前介绍的那些数据类型都不是并发安全的。这一点需要特别注意。
  
    Goroutine(也称为Go程序)可以被看做是承载可被并发执行的代码块的载体。它们由Go语言的运行时系统调度,并依托操作系统线程(又称内核线程)来并发地执行其中的代码块。至于怎样编写这样的代码块以及怎样驱动这样的代码块执行,我们先按下不表。
  
    通道类型的表示方法很简单,仅由两部分组成,如下:

chan T    

    在这个类型字面量中,左边是代表通道类型的关键字chan,而右边则是一个可变的部分,即代表该通道类型允许传递的数据的类型(或称通道的元素类型)。这两部分之间需要以空格分隔。
  
    与其它的数据类型不同,我们无法表示一个通道类型的值。因此,我们也无法用字面量来为通道类型的变量赋值。我们只能通过调用内建函数make来达到目的。make函数可接受两个参数。第一个参数是代表了将被初始化的值的类型的字面量(比如chan int),而第二个参数则是值的长度。例如,若我们想要初始化一个长度为5且元素类型为int的通道值,则需要这样写:

make(chan int, 5)    

    顺便说一句,实际上make函数也可以被用来初始化切片类型或字典类型的值。


    确切地说,通道值的长度应该被称为其缓存的尺寸。换句话说,它代表着通道值中可以暂存的数据的个数。注意,暂存在通道值中的数据是先进先出的,即:越早被放入(或称发送)到通道值的数据会越先被取出(或称接收)。
    
    下面,我们声明一个通道类型的变量,并为其赋值:

ch1 := make(chan string, 5)   

    这样一来,我们就可以使用接收操作符<-向通道值发送数据了。当然,也可以使用它从通道值接收数据。例如,如果我们要向通道ch1发送字符串"value1",那么应该这样做:

ch1 <- "value1"  

    另一方面,我们若想从ch1那里接收字符串,则要这样:

<- ch1    

    这时,我们可以直接把接收到的字符串赋给一个变量,如:

value := <- ch1    

    与针对字典值的索引表达式一样,针对通道值的接收操作也可以有第二个结果值。请看下面的示例:

value, ok := <- ch1     


    这样做的目的同样是为了消除与零值有关的歧义。这里的变量ok的值同样是bool类型的。它代表了通道值的状态,true代表通道值有效,而false则代表通道值已无效(或称已关闭)。更深层次的原因是,如果在接收操作进行之前或过程中通道值被关闭了,则接收操作会立即结束并返回一个该通道值的元素类型的零值。按照上面的第一种写法,我们无从判断接收到零值的原因是什么。不过,有了第二个结果值之后,这种判断就好做了。
   
    说到关闭通道值,我们可以通过调用内建函数close来达到目的,就像这样:

close(ch1)   

    请注意,对通道值的重复关闭会引发运行时恐慌。这会使程序崩溃。所以一定要避免这种情况的发生。另外,在通道值有效的前提下,针对它的发送操作会在通道值已满(其中缓存的数据的个数已等于它的长度)时被阻塞。而向一个已被关闭的通道值发送数据会引发运行时恐慌。另一方面,针对有效通道值的接收操作会在它已空(其中没有缓存任何数据)时被阻塞。除此之外,还有几条与通道的发送和接收操作有关的规则。不过在这里我们记住上面这三条就可以了。
  
  最后,与切片和字典类型相同,通道类型属于引用类型。它的零值即为nil

任务

请在命令源码文件index.go的第 12 和 15 行的圆括号中填入相应代码,使程序打印到标准输出上的内容为“数据已到达!”。提示,在第15行,只能使用针对通道值的某种操作。

?不会了怎么办

在第12行,应该填入"已达到!"。在第15行,应该填入<-ch2

 

||

提问题

写笔记

公开笔记
提交
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

收藏课程后,能更快找到我哦~

使用 Ctrl+D 可将课程添加到书签

邀请您关注公众号
关注后,及时获悉本课程动态

举报

0/150
提交
取消
全部 精华 我要发布
全部 我要发布
最热 最新
只看我的

手记推荐

更多

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?