扫码订阅《 》或入驻星球,即可阅读文章!

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • 宝典简介

    • Go语言问题集
  • channel

    • 什么是 CSP
    • channel 底层的数据结构是什么
    • 向 channel 发送数据的过程是怎样的
    • 从 channel 接收数据的过程是怎样的
    • 关闭一个 channel 的过程是怎样的
    • 从一个关闭的 channel 仍然能读出数据吗
    • 操作 channel 的情况总结
    • 如何优雅地关闭 channel
    • channel 发送和接收元素的本质是什么
    • channel 在什么情况下会引起资源泄漏
    • 关于 channel 的 happened-before 有哪些
    • channel 有哪些应用
  • map

  • interface

  • 标准库-context

  • 标准库-unsafe

  • goroutine调度器

  • 编译和链接

  • 反射

  • 数组和切片

  • GC的认识

扫码订阅《 》或入驻星球,即可阅读文章!

从一个关闭的 channel 仍然能读出数据吗


qcrao

从一个有缓冲的 channel 里读数据,当 channel 被关闭,依然能读出有效值。只有当返回的 ok 为 false 时,读出的数据才是无效的。

func main() {
	ch := make(chan int, 5)
	ch <- 18
	close(ch)
	x, ok := <-ch
	if ok {
		fmt.Println("received: ", x)
	}

	x, ok = <-ch
	if !ok {
		fmt.Println("channel closed, data invalid.")
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

运行结果:

received:  18
channel closed, data invalid.
1
2

先创建了一个有缓冲的 channel,向其发送一个元素,然后关闭此 channel。之后两次尝试从 channel 中读取数据,第一次仍然能正常读出值。第二次返回的 ok 为 false,说明 channel 已关闭,且通道里没有数据。

具体过程可以参考“从 channel 接收数据的过程是怎样的”一节。