Go语言学习笔记 - PART13 - 协程与通道

协程

应用程序处理并发的部分

  • 协程跟操作系统的线程之间不是一对一的关系
  • 协程是独立执行的,它们之间必须同行才会变得有用

通道

负责协程之间的通信,从而避免所有由共享内存导致的陷阱

  • 通道只能传输一种类型的数据(任意一种类型)
  • 通道声明方式
    var ch1 chan string // 声明一个字符串通道
    ch1 = make(chan string) // 实例化通道
复制代码
  • 通信操作符 : 标识数据的传输,数据按照箭头的方向流动
    // 往通道发送数据
    ch <- i 
复制代码
  • for循环从通道中获取数据
    for v := range ch {
    	fmt.Printf("The value is %v\n", v)
    }
复制代码
  • 指定通道的方向
    var send_only chan<- int 		// 只接收数据的通道
    var recv_only <-chan int		// 只发送数据的通道
复制代码
  • 关闭通道
    • 通道是可以被显示关闭的;只有发送方需要关闭通道,接收方不需要关闭通道
    • close函数关闭通道
      • 将通道标记为无法通过发送操作<-接受更多的值;给已经关闭的通道发送或者再次关闭都会导致运行时的 panic
    • 检测通道是否关闭
    v, ok := <-ch   // 使用, ok操作符检测通道是否关闭
复制代码

协程切换

    select {
    case u:= <- ch1:
           ...
    case v:= <- ch2:
            ...
            ...
    default: // no value ready to be received
            ...
    }
复制代码
  • 通过select关键字,从不同的并发执行的协程中获取值
  • select关键字可以监听进入通道的数据或从通道出去的数据
  • select 要做的事,选择处理列出多个通信情况中的一个
    • 如果都阻塞了,会等待知道其中一个可以处理
    • 如果多个可以处理,随机选择一个
    • 如果没有通道操作可以处理,但写了default语句,它就会执行default(确保不被阻塞)

入门教程推荐: github.com/Unknwon/the…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值