1. channel存在3种状态:

    1. nil,未初始化的状态,只进行了声明,或者手动赋值为nil

    2. active,正常的channel,可读或者可写

    3. closed,已关闭,千万不要误认为关闭channel后,channel的值是nil

    4. 当需要不断从channel读取数据时,使用for range,当channel关闭时,for循环会自动退出,无需主动监测channel是否关闭

for x := range ch{fmt.Println(x)
}
  1. 读channel,但不确定channel是否关闭时,可用ok进行判断,ok为true时读到数据且通道没有关闭
if v, ok := <- ch; ok {fmt.Println(v)
}
  1. 要对多个通道进行同时处理,但只处理最先发生的channel时,select可以同时监控多个通道的情况,只处理未阻塞的case。当通道为nil时,对应的case永远为阻塞,无论读写。特殊关注:普通情况下,对nil的通道写操作是要panic的
// 分配job时,如果收到关闭的通知则退出,不分配job
func (h *Handler) handle(job *Job) {select {case h.jobCh<-job:return case <-h.stopCh:return}
}
  1. 协程对某个通道只读或只写时,
  • 如果协程对某个channel只有写操作,则这个channel声明为只写
  • 如果协程对某个channel只有读操作,则这个channe声明为只读
// 只有generator进行对outCh进行写操作,返回声明
// <-chan int,可以防止其他协程乱用此通道,造成隐藏bug
func generator(int n) <-chan int {outCh := make(chan int)go func(){for i:=0;i<n;i++{outCh<-i}}()return outCh
}// consumer只读inCh的数据,声明为<-chan int
// 可以防止它向inCh写数据
func consumer(inCh <-chan int) {for x := range inCh {fmt.Println(x)}
}
  1. 使用缓冲channel增强并发和异步
  • 有缓冲通道是异步的,无缓冲通道是同步的
  • 有缓冲通道可供多个协程同时处理,在一定程度可提高并发性
// 无缓冲,同步
ch1 := make(chan int)
ch2 := make(chan int, 0)
// 有缓冲,异步
ch3 := make(chan int, 1)
// 使用5个`do`协程同时处理输入数据
func test() {inCh := generator(100)outCh := make(chan int, 10)for i := 0; i < 5; i++ {go do(inCh, outCh)}for r := range outCh {fmt.Println(r)}
}func do(inCh <-chan int, outCh chan<- int) {for v := range inCh {outCh <- v * v}
}
  1. 需要超时控制的操作,使用select和time.After,看操作和定时器哪个先返回,处理先完成的,就达到了超时控制的效果
func doWithTimeOut(timeout time.Duration) (int, error) {select {case ret := <-do():return ret, nilcase <-time.After(timeout):return 0, errors.New("timeout")}
}func do() <-chan int {outCh := make(chan int)go func() {// do work}()return outCh
}
  1. 使用time实现channel无阻塞读写。是为操作加上超时的扩展,这里的操作是channel的读或写
func unBlockRead(ch chan int) (x int, err error) {select {case x = <-ch:return x, nilcase <-time.After(time.Microsecond):return 0, errors.New("read time out")}
}func unBlockWrite(ch chan int, x int) (err error) {select {case ch <- x:return nilcase <-time.After(time.Microsecond):return errors.New("read time out")}
}
  1. 使用close(ch)关闭所有下游协程,所有读ch的协程都会收到close(ch)的信号
func (h *Handler) Stop() {close(h.stopCh)// 可以使用WaitGroup等待所有协程退出
}// 收到停止后,不再处理请求
func (h *Handler) loop() error {for {select {case req := <-h.reqCh:go handle(req)case <-h.stopCh:return}}
}
  1. 使用chan struct{}作为信号channel,当使用channel传递信号,而不是传递数据时,,没数据需要传递时,传递空struct
// 上例中的Handler.stopCh就是一个例子,stopCh并不需要传递任何数据
// 只是要给所有协程发送退出的信号
type Handler struct {stopCh chan struct{}reqCh chan *Request
}
  1. 使用channel传递结构体数据时,传递结构体的指针而非结构体,,channel本质上传递的是数据的拷贝,拷贝的数据越小传输效率越高,传递结构体指针,比传递结构体更高效
reqCh chan *Request// 好过
reqCh chan Request

channel十点技巧相关推荐

  1. Channel使用技巧

    前言 Go协程一般使用channel(通道)通信从而协调/同步他们的工作.合理利用Go协程和channel能帮助我们大大提高程序的性能.本文将介绍一些使用channel的场景及技巧 场景一,使用cha ...

  2. 网安面试只要掌握这十点技巧,轻轻松松吊打面试官

    结合工作经验,在这里笔者给企业网管员提供一些保障企业网络安全的建议,帮助他们用以抵御网络入侵.恶意软件和垃圾邮件. 定义用户完成相关任务的恰当权限 拥有管理员权限的用户也就拥有执行破坏系统的活动能力, ...

  3. ​Golang 并发编程指南

    分享 Golang 并发基础库,扩展以及三方库的一些常见问题.使用介绍和技巧,以及对一些并发库的选择和优化探讨. go 原生/扩展库 提倡的原则 不要通过共享内存进行通信;相反,通过通信来共享内存. ...

  4. 晚上十点以后发快手有影响吗?上热门有哪些技巧?

    很多的快手用户都希望自己发布的作品能够上热门,变得火爆起来,所以说掌握一些技巧是非常的重要的,比如说发快手作品的时间,就需要去进行注意,晚上十点以后发快手有影响吗? 晚上十点以后发快手有影响吗? 凌晨 ...

  5. CRM平台十点功能帮助企业提高销售营销技巧(下)

    企业中,销售对收入增长至关重要,但没有营销团队支持的销售团队很难达成交易.在许多企业中,这两个团队各自为政,没有足够的合作,对企业转化新客户和长期发展的能力产生了负面影响.针对这个情况,我们从CRM角 ...

  6. 阿里程序员工作小技巧:理解CPU分支预测,提高代码效率

    技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,体现也会在优秀程序员在工作效率提升,产品性能优化和用户体验改善等小技巧方面的分享,以提高我们的工作能力 ...

  7. go channel 缓冲区最大限制_Java内卷系列之你不得不知的Go并发基础

    勾哥:最近跟面试的兄弟们聊,仅仅懂 Java 确实不够.我上周在脉脉上看到有人吐槽:移动端开发开始内卷,面试难度非常高.其实 Java 不也如此么,大数据.人工智能,都要开始了解了.今年冬天真是不好过 ...

  8. 详细设计说明书读后感_明晚十点,和大家详细介绍这本版式设计新书!

    点击上方蓝字,把我设置为星标☆吧前天和大家简单透露了这本书<收到一本新书<版式设计>,很实用!>今天出版社负责人和我说这本最新的版式设计与网格系统书籍已经在过塑和封膜中意思就是 ...

  9. 人体姿态估计(Human Pose Estimation)技巧方法汇总

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:Poeroz https://zhuanlan.zhihu.com/p/10 ...

最新文章

  1. HDU 2564 词组缩写
  2. 2020年日历_2020年《故宫日历》发布 纪念紫禁城建成六百年
  3. SWFUpload V2.2.0 说明文档
  4. 2019蓝桥杯省赛---java---C---5(最大降雨量)
  5. Iphone代码创建视图
  6. 使用 XML 维护 Selenium 自动化测试脚本 ZT
  7. MSSQL2008如何关闭代码智能提示?
  8. 电子书格式如何相互转换ePub、Azw3、Mobi、Doc、PDF、TXT
  9. jieba分词怎么操作_如何运用jieba库分词
  10. 免费屏幕录像软件哪个好?简单几步教你快速录制无水印的高清视频!
  11. 动态规划-背包问题求解过程【代码 from eason】
  12. 带求和符号的函数求导
  13. html引入第三方库,基于webpack实现多html页面开发框架七 引入第三方库如jquery
  14. 一些国外的MD5破解网站
  15. 剑指offer 学习笔记 和为s的数字
  16. 团队组成五个基本要素_团队建设的五个要素是什么?
  17. 吴式太极大师修丕勋简介
  18. android app防止锁屏_Android 禁止屏幕休眠和锁屏的方法 | 学步园
  19. 什么是竞争情报(CI)?
  20. 机器学习数学笔记|大数定理中心极限定理矩估计

热门文章

  1. Android WebView 加载失败(net::ERR_CLEARTEXT_NOT_PERMITTED)
  2. 如何抓到入侵网站的黑客?
  3. 手把手教你调试构建一个Vue/小程序商城项目源码
  4. 2022-08-01 零基础吉他入门知识(二) 吉他上的十二平均律,给吉他调弦,规范化弹吉他:节拍器,持琴姿势和拨弦手势
  5. 我的百度网盘分享链接
  6. themeleaf渲染富文本
  7. java解析网页全过程_Java网页解析
  8. 就这么漂来漂去---一个毕业三个月的java程序员的裸辞风波
  9. 自动驾驶 常用的汽车连接器
  10. 下载安装SQL Server数据库ODBC驱动和配置SQL Server ODBC数据源