package main import ( "fmt" ) func main() { //無緩沖,將會阻塞在接收數據 c := make(chan int) go func() { for i := 0; i < 5; i++ { c <- i } //把 close(c) 注釋掉,程序會一直阻塞在 if data, ok := <-c; ok 那一行 close(c) }() for { //ok為true說明channel沒有關閉,為false說明管道已經關閉 if data, ok := <-c; ok { fmt.Println(data) } else { break } } fmt.Println("Finished") }
如果發送者知道,沒有更多的值需要發送到channel的話,那么讓接收者也能及時知道沒有多余的值可接收將是有用的,因為接收者可以停止不必要的接收等待。這可以通過內置的close函數來關閉channel實現。
注意:
l channel不像文件一樣需要經常去關閉,只有當你確實沒有任何發送數據了,或者你想顯式的結束range循環之類的,才去關閉channel;
l 關閉channel后,無法向channel 再發送數據(引發 panic 錯誤后導致接收立即返回零值);
l 關閉channel后,可以繼續從channel接收數據;
l 對於nil channel,無論收發都會被阻塞。