當前位置: 首頁>>編程語言>>正文


Go語言教程:通道的關閉

返回Go語言教程首頁

概念簡介

關閉一個通道意味著不能再向這個通道發送值了。這個特性可以用來給這個通道的接收方傳達工作已經完成的信息。

例程代碼


package main

import "fmt"

// 在這個例子中,我們將使用一個 `jobs` 通道來傳遞 `main()` 中 Go
// 協程任務執行的結束信息到一個工作 Go 協程中。當我們沒有多餘的
// 任務給這個工作 Go 協程時,我們將 `close` 這個 `jobs` 通道。
func main() {
    jobs := make(chan int, 5)
    done := make(chan bool)

    // 這是工作 Go 協程。使用 `j, more := <- jobs` 循環的從
    // `jobs` 接收數據。在接收的這個特殊的二值形式的值中,
    // 如果 `jobs` 已經關閉了,並且通道中所有的值都已經接收
    // 完畢,那麽 `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` 發送 3 個任務到工作函數中,然後
    // 關閉 `jobs`。
    for j := 1; j <= 3; j++ {
        jobs <- j
        fmt.Println("sent job", j)
    }
    close(jobs)
    fmt.Println("sent all jobs")

    // 我們使用前麵學到的[通道同步](../channel-synchronization/)
    // 方法等待任務結束。
    <-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

# 通過關閉通道的學習,也讓下麵學習通道遍曆水到渠成。

課程導航

學習上一篇:Go語言教程:非阻塞通道操作    學習下一篇:Go語言教程:通道遍曆

相關資料

本例程github源代碼:https://github.com/xg-wang/gobyexample/tree/master/examples/closing-channels

Go語言通道的關閉

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/4056.html,未經允許,請勿轉載。