在线文档  >   Golang练习   >   通道关闭

在Go中, 使用close关键字,表示 关闭 一个通道后不会再有值被发送到其中。这可用于向通道的接收者通知完成操作。

package main

import "fmt"

// 在这个例子中,我们将使用 jobs 通道来将要执行的工作从 main() 协程 发送到一个 worker 协程 中。
// 当没有更多工作可供 worker 执行时,我们将 关闭 jobs 通道。
func main() {
    jobs := make(chan int, 5)
    done := make(chan bool)

    //这是 worker 协程。它使用 `j, more := <-jobs` 重复从 `jobs` 通道接收值。
    // 在这个特殊的 2 值接收形式中,如果通道已经被 `close` ,并且通道中的所有值都已经被接收,则 `more` 的值将为 `false`。
    // 我们使用它来在我们完成所有工作时,通过 `done` 通道进行通知。
    go func() {
        for {
            j, more := <-jobs
            if more {
                fmt.Println("received job", j)
            } else {
                fmt.Println("received all jobs")
                done <- true
                return
            }
        }
    }()

    // 这将通过 `jobs` 通道向 worker 发送 3 个工作,然后关闭通道。
    for j := 1; j <= 3; j++ {
        jobs <- j
        fmt.Println("sent job", j)
    }
    close(jobs)
    fmt.Println("sent all jobs")

    // 我们使用之前介绍的 通道同步 方法等待 worker 协程。
    <-done
}

运行结果如下:

$ go run closing-channels.go 
sent job 1
received job 1
sent job 2
received job 2
sent job 3
received job 3
sent all jobs
received all jobs

关闭通道的概念自然会引出我们的下一个示例:通道上的range