首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go程序例子(36):关闭通道

Go程序例子(36):关闭通道

原创
作者头像
用户11078756
发布2024-12-18 09:28:59
发布2024-12-18 09:28:59
13900
代码可运行
举报
文章被收录于专栏:go程序例子go程序例子
运行总次数:0
代码可运行

关闭通道表示不再向其发送值。这对于向通道的接收者传达完成状态非常有用。

代码语言:go
复制
package main

import "fmt"
// 在这个示例中,我们将使用一个 jobs 通道将待处理的工作从 main() goroutine 传递到 worker goroutine。当我们没有更多的工作要分配给 worker 时,我们将关闭 jobs 通道。
func main() {
    jobs := make(chan int, 5)
    done := make(chan bool)
	// 这是 worker goroutine。它通过 j, more := <-jobs 反复从 jobs 通道接收。在这种特殊的接收形式中,当 jobs 通道被关闭且所有值都已被接收时,more 的值将为 false。我们利用这一点来通知任务完成,当我们处理完所有工作时。
    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
	// 从关闭的通道读取会立即成功,返回底层类型的零值。可选的第二个返回值为 true,如果接收到的值是通过成功的发送操作传递到通道的;如果接收到的是因为通道已关闭且为空而生成的零值,则第二个返回值为 false。
    _, ok := <-jobs
    fmt.Println("received more jobs:", ok)
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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
received more jobs: false

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档