Go語言 之關閉channel


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,無論收發都會被阻塞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM