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中,可能會造成丟包的