首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go Tour练习#7:关闭频道

基础概念

在Go语言中,通道(channel)是一种用于在不同的goroutine之间进行通信的机制。通道提供了一种同步的方式来传递数据,确保数据的安全性和一致性。通道可以是带类型的,这意味着它们只能传递特定类型的数据。

关闭通道

关闭通道是一个可选的操作,它表示通道不再接受新的值,但仍然可以从已关闭的通道中接收已发送的值,直到通道为空。关闭通道通常用于通知接收方goroutine所有数据已经发送完毕,可以安全地退出。

优势

  1. 同步:关闭通道可以作为一种同步机制,通知接收方goroutine所有数据已经发送完毕。
  2. 资源管理:关闭不再需要的通道可以释放相关资源。
  3. 避免死锁:正确关闭通道可以避免因等待未发送的数据而导致的死锁。

类型

  • 无缓冲通道:发送操作会阻塞,直到有另一个goroutine准备好接收数据。
  • 有缓冲通道:发送操作在通道未满时不会阻塞,接收操作在通道非空时不会阻塞。

应用场景

  • 任务分发:将任务分发给多个goroutine处理,完成后通过关闭通道通知主goroutine。
  • 并发控制:通过关闭通道来控制并发goroutine的数量。
  • 数据流处理:在数据处理管道中,通过关闭通道来表示数据流的结束。

示例代码

以下是一个简单的示例,展示了如何关闭通道:

代码语言:txt
复制
package main

import (
    "fmt"
    "sync"
)

func worker(done chan bool) {
    fmt.Println("working...")
    // 模拟工作
    fmt.Println("finished")
    done <- true
}

func main() {
    var wg sync.WaitGroup
    done := make(chan bool, 1)

    wg.Add(1)
    go func() {
        defer wg.Done()
        worker(done)
    }()

    <-done // 等待worker完成
    close(done) // 关闭通道

    wg.Wait()
}

参考链接

Go官方文档 - Channels

常见问题及解决方法

为什么关闭通道后还能接收到值?

关闭通道后,仍然可以从通道中接收已发送的值,直到通道为空。这是因为关闭通道只是表示不再接受新的值,但已经发送的值仍然可以被接收。

如何避免重复关闭通道?

在关闭通道之前,应该检查通道是否已经关闭。可以使用defer语句来确保通道只关闭一次:

代码语言:txt
复制
func closeChannel(ch chan int) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("channel already closed")
        }
    }()
    close(ch)
}

如何处理关闭通道时的panic?

如果在关闭已经关闭的通道时,会引发panic。为了避免这种情况,可以使用recover来捕获并处理panic:

代码语言:txt
复制
func safeClose(ch chan int) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("channel already closed")
        }
    }()
    close(ch)
}

通过以上方法,可以有效地管理和使用通道,确保并发程序的正确性和稳定性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么Go的自定义error有时候会内存溢出

分享一个在go tour上看到的练习题,练习里要求用户自己定义一个错误类型,实现 error接口,函数在参数不满足条件的时候返回自定义的错误类型的值。...下面贴一下具体的练习题 Practice 从之前的练习中复制 Sqrt 函数,修改它使其返回 error 值。 Sqrt 接受到一个负数时,应当返回一个非 nil 的错误值。复数同样也不被支持。...verb, plus, false, depth) return ` 通过链接可以在Github上看到这块详细的源码 https://github.com/golang/go.../blob/2ed57a8cd86cec36b8370fb16d450e5a29a9375f/src/pkg/fmt/print.go#L639 这个练习感觉还是给开发者提示了一个非常隐蔽的坑,感兴趣的可以通过阅读原文的链接访问到...go tour上的这个练习题自己试验一下。

82910

如何愉快地学习 Go 语言?来场 Go 之旅吧!

Go 语言之旅,支持在线敲代码练习的官方入门教程 Go 语言性能很高,非常适于后端网络、分布式编程,因此受到各大互联网公司的青睐。 那么如何学习 Go 语言呢?...其实官方已经为我们准备了一款在线 Go 语言教程 —— Go 语言之旅(gotour),支持在线敲代码练习,简直入门必备!...不建议使用 在线的 gotour(http://tour.studygolang.com/welcome/1),因为网络不是很通畅,可能无法访问。 因此下面我们将它安装到本地运行。 1....# 进入目录 cd $GOPATH/src/bitbucket.org/mikespook # 下载gotour源码 hg clone https://bitbucket.org/mikespook/go-tour-zh...编译安装 进入已下载的 gotour 目录,对 go 源文件进行编译安装: # 进入gotour源码目录 cd $GOPATH/src/bitbucket.org/mikespook/go-tour-zh

1K31
  • 01.GO基础知识(幼儿园级别教程 )

    01.GO基础知识关键词:GO语言教程;Go语言;GoGo语言初级教程幼儿园级别教程之 01.GO基础知识目录01.GO基础知识1.GO语言的发展历程2.发展历程3.Windowns安装4.VSCode...,因此我们就一行就写一条语句,不能把多余的语句写在同一个,否则报错(6)定义的变量或者import 的包如果没有使用到,代码就不能通过编译(7)大括号都是成对出现5.4 代码风格(1)注意缩进(2)括号要成对...一行不超过80个字符,超过的话使用加号var name3 = "sadfasldfjkajsdfjalsdfasdkfjalksjdf" + "测试中故宫撒旦发多少发就发司法解释咖啡机阿克苏的风景"(7)...://studygolang.com/pkgdoc学习网址:包含教学面试各种框架插件等: https://www.topgoer.com/学习网址(推荐):GO编程练习的网址,每节都有示例且可以在线运行...: https://tour.go-zh.org/basics/1学习网址:GO编程练习的网址,每节都有示例代码:英文的:https://gobyexample.com/关键词:GO语言教程;Go语言;

    23920

    再宅下去就会发现,XR已悄无声息地渗透你的生活

    文 | 丰木 (VRPinea3月22日电)近期,爱马仕、香奈儿、劳力士、百达翡丽相继关闭了他们在欧洲的生产基地,引发了网友们的热议,这说明国外新冠肺炎疫情的影响日益加剧。...3D可视化解决方案公司Concept3D宣布将在6月30日之前,免费限时开放其企业级预览系统360° Tour System,支持学生和父母在线参观大学校园。 ?...360° Tour System是一种快速有效的360°预览开发和管理工具,其特点是可同时显示4个不同的360°场景,还可叠加2D地图、信息、视频和音频。 ?...AI 本次活动的嘉宾主要是“Tacitly”、“Kizuna AI”和“YuNi”,还有来自中国的“泠鸢yousa”,用户可通过安卓智能手机和Oculus Quest观看,也可在YouTube360频道...、YouTube LIVE频道和NicoNico动画频道上进行观看。

    81010

    go语言后端框架2021_go语言编译器

    以Window 7为例,右击我的电脑->属性会打开系统控制面板,然后在左侧找到高级系统设置点击打开,会在弹出的界面最下方看到环境变量按钮,点击它,就可以看到环境变量配置界面了。...假设我要创建一个tour项目,它位于~/Desktop/tour目录下,那我现在打开终端,CD到~/Desktop/tour目录下,输入如下命令即可创建一个Go Module工程。...➜ tour go mod init flysnow.org/tour go: creating new go.mod: module flysnow.org/tour 当前生成的Go Module工程只有一个...Hello World 好了,有了tour项目,就可以演示下Go语言版本的Hello World了,在tour根目录下的main.go(如没有这个文件,就新建一个)文件中,添加如下Go代码。...在~/Desktop/tour目录下运行如下代码即可安装。 ➜ go install flysnow.org/tour 打开终端,运行上面的命令即可,install后接全路径的包名。

    1K30

    Go语言环境搭建详解(2020版)

    以Window 7为例,右击我的电脑->属性会打开系统控制面板,然后在左侧找到高级系统设置点击打开,会在弹出的界面最下方看到环境变量按钮,点击它,就可以看到环境变量配置界面了。...假设我要创建一个tour项目,它位于~/Desktop/tour目录下,那我现在打开终端,CD到~/Desktop/tour目录下,输入如下命令即可创建一个Go Module工程。...➜ tour go mod init flysnow.org/tour go: creating new go.mod: module flysnow.org/tour 当前生成的Go Module...工程只有一个go.mod文件,它的内容如下所示: module flysnow.org/tour go 1.15 其中module flysnow.org/tour代表该项目的path,也就是最顶层的...Hello World 好了,有了tour项目,就可以演示下Go语言版本的Hello World了,在tour根目录下的main.go(如没有这个文件,就新建一个)文件中,添加如下Go代码。

    6.4K30

    Python 编程 5 年后,我转向了 Go

    01 我遇到的主要差异 当然,作为第一步,我浏览了令人叹为观止的官方“Tour Of Go”(https://tour.golang.org/welcome/),这确实让我有了良好的关于Go语法的基础知识...5.清洁的代码 Go编译器将始终尽力保持代码清洁。 Go编译器将未使用的变量视为编译错误,而且,Go采用了独特的方法让机器处理大多数格式问题。...包含Go格式信息的必读文档是“Effective Go”(https://golang.org/doc/effective_go.html)。...Francesc Campoy(https://twitter.com/francesc)- 你肯定需要查看他的YouTube频道和GitHub资料(https://github.com/campoy)...这样的社区可以帮助你顺利过渡到GoGo是当今发展最快的编程语言之一,我希望将来Go能够成为Google编写云应用程序和基础架构的首选语言。

    92820

    二.编译运行、语法规范、注释转义及API标准库知识普及

    回车符 (相当于 \x0D) \v 纵向制表符 (相当于 \x0B) \123 匹配 8 進制编码所代表的字符(必须是 3 位数字) \x7F...点击“Tour”可进入编程指南,点击“packages”可查看官方标准包说明文档。...1.编程指南 点击“Tour”编程指南显示如下图所示: https://tour.golang.org/welcome/1 下列代码输出结果如下: package main import "fmt"...1.题目 虽然GO语言的基本语法下一篇文章再叙述,但作者希望你们能通过搜索引擎独立解决这六个基础练习,加油!...四.Golang编程指南 1.编程指南 2.官方API标准库 五.Dos常用指令 1.目录操作指令 2.文件操作指令 3.其它指令 六.Golang编程练习 1.题目 2.解答 编程习惯和Go基本概念了解后

    93230

    二.编译运行、语法规范、注释转义及API标准库知识普及

    回车符 (相当于 \x0D) \v 纵向制表符 (相当于 \x0B) \123 匹配 8 進制编码所代表的字符(必须是 3 位数字) \x7F...点击“Tour”可进入编程指南,点击“packages”可查看官方标准包说明文档。...1.编程指南 点击“Tour”编程指南显示如下图所示: https://tour.golang.org/welcome/1 下列代码输出结果如下: package main import "fmt"...1.题目 虽然GO语言的基本语法下一篇文章再叙述,但作者希望你们能通过搜索引擎独立解决这六个基础练习,加油!....编程风格 四.Golang编程指南 1.编程指南 2.官方API标准库 五.Dos常用指令 1.目录操作指令 2.文件操作指令 3.其它指令 六.Golang编程练习 1.题目 2.解答 编程习惯和Go

    47430

    好物周刊#32:Go 学习指南

    三、网站 1. oeasy 教程 [7] 一个完全免费的综合性视频教程网站,包括 PS 教程、手机摄影教程、AI 作图教程、Excel 教程、PPT 教程、Word 教程、AE 教程等。...专为各类学校和培训机构提供考试系统,包括自测练习、组织统一考试、开展知识竞赛、布置课外作业或假期作业、智能组卷、答卷评阅与成绩管理等众多功能;也可用于政府机构、企事业单位内部的入职考试、员工考核、内部培训考试等...Go 指南 [14] 涵盖 Go 语言的大部分重要特性,主要包括基础、方法和接口、并发三大方面的内容。 3....lattics.zineapi.com/zh-CN [5] 葫芦笔记: https://www.hulunote.com/ [6] 滴墨书摘: https://www.shimonote.net/ [7]...hl=zh-CN [13] Go 语言中文文档: https://www.topgoer.com/ [14] Go 指南: https://tour.go-zh.org/list [15] Go 语言设计与实现

    21410
    领券