golang channel關閉后,其中剩余的數據,是可以繼續讀取的。
請看下面的測試例子。
創建一個帶有緩沖的channel,向channel中發送數據,然后關閉channel,最后,從channel中讀取數據,輸出結果。
package main
import (
"fmt"
)
func main(){
ch := make(chan int, 3)
ch <-1
ch <-2
ch <-3
close(ch)
for value := range ch {
fmt.Println("value:", value)
}
}
output:
value: 1
value: 2
value: 3
可以看到,channel關閉之后,仍然可以從channel中讀取剩余的數據,直到數據全部讀取完成。
多說一點,對於一個關閉的channel,如果繼續向channel發送數據,會引起panic。
如果繼續讀數據,得到的是零值(對於int,就是0)。
判斷一個channel的方式有兩種:
一種方式:
value, ok := <- ch
ok是false,就表示已經關閉。
另一種方式,就是上面例子中使用的方式:
for value := range ch {
}
如果channel被關閉,會跳出循環。