go中的channel
channel是类型相关的
- 声明
var channame chan chantype
- 定义
ch := make(chan int)
- 基本操作
value := <- ch1```
当没有设置缓冲区时,channel的读写都会阻塞
单向channel
```var ch2 chan<- int // ch2是单向channel,只用于写int数据```
```var ch3 <-chan int // ch3是单向channel,只用于读取int数据```
4. 缓冲机制
```ch := make(chan int, 1024)```
当设置缓冲区大小时,在缓冲区填满前不会阻塞
5. 超时处理
可以利用select来实现channel的超时机制
timeout := make(chan bool, 1)
go func() {
time.sleep(1e9)
timeout <- true
}()
select{
case <-ch:
case <- timeout:
}
这样无论ch是否接收到数据,都会达到超时的效果
6. 关闭
```close(ch)```
在一个已关闭 channel 上执行接收操作(<-ch)总是能够立即返回,返回值是对应类型的零值。
经常利用这点来作为goroutine的停止信号
##扩展阅读
超时操作可以用time.Ticker来做,下面可以举一个简单的例子
package main
import "time"
ticker := time.NewTicker(1 * time.Second)
for {
select {
case <- ticker.C:
//do something
}
}
上面的例子还要注意一点就是select是随机决定哪个case被执行的,假如把接收数据的channel也放到这个select中,可能会造成丢包的