[go] chan close

close chan

  • close由发送端调用,在收到最后一个发送值后关闭管道(It should be executed only by the sender, never the receiver, and has the effect of shutting down the channel after the last sent value is received)
  • close管道后,所有从管道的读取会获得元素对应类型的零值(any receive from c will succeed without blocking, returning the zero value for the channel element.)
package main

import (
    "fmt"
    "time"
)

func main() {
    stop := make(chan struct{})

    go func() {
        select {
        case _, ok := <-stop:
            fmt.Println("stop 01: ", ok)
        }
    }()

    go func() {
        select {
        case _, ok := <-stop:
            fmt.Println("stop 02: ", ok)
        }
    }()

    stop <- struct{}{}
    close(stop)

    time.Sleep(time.Second * 2)

    _, ok := <-stop
    fmt.Println("stop chan: ", ok)
}
stop 02: true
stop 01: false
stop chan: false

结论:chan中发送的值被第二个协程读取,主协程和第一个协程的读取都返回了bool的零值(false)

  • 不允许给已关闭的chan发送值,见下例:

    package main
    
    func main() {
      stop := make(chan struct{})
      close(stop)
    
      stop <- struct{}{}
    }
    panic: send on closed channel
  • 给chan发送值,只能被读取一次

    package main
    
    import (
      "fmt"
      "time"
    )
    
    func main() {
      stop := make(chan struct{})
    
      go func() {
          select {
          case _, ok := <-stop:
              //stop = nil
              fmt.Println("stop 01: ", ok)
          }
      }()
    
      go func() {
          select {
          case _, ok := <-stop:
              fmt.Println("stop 02: ", ok)
          }
      }()
    
      stop <- struct{}{}
    
      time.Sleep(time.Second * 2)
    }
    stop 02: true

这里因为只给chan发送了一个值,所以只会退出一个协程(随机性)。

心不死则道不生,欲不灭则道不存。

1 声望
0 粉丝
0 条评论
推荐阅读
一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go33阅读 2.5k评论 1

封面图
前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin23阅读 3.2k评论 6

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 58.1k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.5k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 11.9k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.7k

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.3k

心不死则道不生,欲不灭则道不存。

1 声望
0 粉丝
宣传栏