协程
应用程序处理并发的部分
- 协程跟操作系统的线程之间不是一对一的关系
- 协程是独立执行的,它们之间必须同行才会变得有用
通道
负责协程之间的通信,从而避免所有由共享内存导致的陷阱
- 通道只能传输一种类型的数据(任意一种类型)
- 通道声明方式
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…