Bruce Blog Bruce Blog
首页
  • CentOS
  • Ubuntu-Debian
  • 系统网络
  • 系统辅助工具
  • MySQL
  • Redis
  • Mongodb
  • Docker基础
  • Container基础
  • Kubernetes

    • Kubernetes基础
    • Kubernetes辅助
  • Container-Network
  • Jenkins
  • Gitlab
  • ArgoCD
  • Ansible
  • Terraform
  • AWS
  • MQ
  • NGINX
  • JumpServer
  • 基础
  • 函数模块
  • 框架
  • 基础

    • Golang环境
    • 语法
    • 数据类型与运算符
    • 分支语句
    • 循环语句
    • 数组
    • 切片
    • Map
    • String
    • 函数
    • 包的管理
    • 指针
    • 结构体
    • Go语言中的OOP
    • 方法和接口
    • 错误处理
  • Go进阶

    • Go进阶
  • Go框架

    • Go框架
  • Golang辅助

    • Golang辅助
  • CSS
  • HTML
  • JavaScript
  • 前端辅助
  • 常用命令
  • 性能监控工具
  • Windows下Docker使用
  • 日常学习
  • 其他导航

Bruce Tao

运维界的该溜子
首页
  • CentOS
  • Ubuntu-Debian
  • 系统网络
  • 系统辅助工具
  • MySQL
  • Redis
  • Mongodb
  • Docker基础
  • Container基础
  • Kubernetes

    • Kubernetes基础
    • Kubernetes辅助
  • Container-Network
  • Jenkins
  • Gitlab
  • ArgoCD
  • Ansible
  • Terraform
  • AWS
  • MQ
  • NGINX
  • JumpServer
  • 基础
  • 函数模块
  • 框架
  • 基础

    • Golang环境
    • 语法
    • 数据类型与运算符
    • 分支语句
    • 循环语句
    • 数组
    • 切片
    • Map
    • String
    • 函数
    • 包的管理
    • 指针
    • 结构体
    • Go语言中的OOP
    • 方法和接口
    • 错误处理
  • Go进阶

    • Go进阶
  • Go框架

    • Go框架
  • Golang辅助

    • Golang辅助
  • CSS
  • HTML
  • JavaScript
  • 前端辅助
  • 常用命令
  • 性能监控工具
  • Windows下Docker使用
  • 日常学习
  • 其他导航
  • 基础

  • Go进阶

    • Go进阶
    • File操作
    • IO操作
    • 文件复制
    • 断点续传
    • bufio包
    • ioutil包
    • 遍历目录
    • 并发性Concurrency概念
    • Goroutine初识
    • Goroutine并发模型
    • Runtime包
    • 临界资源安全问题
    • sync包WaitGroup
    • 互斥锁
    • 读写锁
    • Channel通道
    • 关闭通道和通道上范围循环
      • 缓冲通道
      • 定向通道
      • time包中的通道相关函数
      • select语句
      • CSP并发模型
      • Go语言反射(一)
      • Go语言反射(二)
    • Go框架

    • Golang辅助

    • Golang
    • Go进阶
    Bruce
    2022-12-03
    目录

    关闭通道和通道上范围循环

    # 关闭通道和通道行访问循环

    # 一、关闭通道

    发送者可以通过关闭信道,来通知接收方不会有更多的数据被发送到channel上.

    close(ch)
    
    1

    接收者可以在接收来自通道的数据时使用额外的变量来检查通道是否已经关闭.

    语法结构:

    v,ok := <- ch
    
    1

    类似map操作,存储key , value键值对

    v,ok := map[key] //根据key从map中获取value,如果key存在,v就是对应的数据,如果key不存在,v是默认值

    在上面的语句中,如果ok的值是true,表示成功的从通道中读取了一个数据value.如果ok是false,这意味着正在从一个封闭的通道读取数据.从关闭通道读取的值将是通道类型的零值.

    例如,如果通道是一个int通道,那么封闭通道接收的值将为0.

    示例代码

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main()  {
        ch1 := make(chan int)
        go sendData(ch1)
        /*
        子goroutine,写出数据10个
                每写一个,阻塞一次,主程序读取一次,解除阻塞
    
        主goroutine:循环读
                每次读取一个,堵塞一次,子程序,写出一个,解除阻塞
    
        发送发,关闭通道的--->接收方,接收到的数据是该类型的零值,以及false
         */
        //主程序中获取通道的数据
        for{
            time.Sleep(1*time.Second)
            v, ok := <- ch1 //其他goroutine,显示的调用close方法关闭通道。
            if !ok{
                fmt.Println("已经读取了所有的数据,", ok)
                break
            }
            fmt.Println("取出数据:",v, ok)
        }
    
        fmt.Println("main...over....")
    }
    func sendData(ch1 chan int)  {
        // 发送方:10条数据
        for i:=0;i<10 ;i++  {
            ch1 <- i//将i写入通道中
        }
        close(ch1) //将ch1通道关闭了。
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39

    运行结果

    image-20221124211123445

    在上面的程序中,send Goroutine将0到9写入chl通道,然后关闭通道.主函数里有一个无限循环.它检查通道是否字在发送数据后,使用变量ok关闭.如果ok是假的,则意味着通道关闭,因此循环结束.还可以打印接收到的值和OK的值.

    # 二、通道上的范围循环

    可以循环从通道上获取数据,知道通道关闭.for循环的for range形式可用于从通道接收值,知道它关闭为止.

    使用range循环,示例代码:

    package main
    
    import (
        "time"
        "fmt"
    )
    
    func main()  {
        ch1 :=make(chan int)
        go sendData(ch1)
        // for循环的for range形式可用于从通道接收值,直到它关闭为止。
        for v := range ch1{
            fmt.Println("读取数据:",v)
        }
        fmt.Println("main..over.....")
    }
    func sendData(ch1 chan int)  {
        for i:=0;i<10 ; i++ {
            time.Sleep(1*time.Second)
            ch1 <- i
        }
        close(ch1)//通知对方,通道关闭
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    运行结果

    image-20221124211743552

    image-20221124212014316

    上次更新: 2024/04/09, 16:48:42
    Channel通道
    缓冲通道

    ← Channel通道 缓冲通道→

    最近更新
    01
    AWS NAT-NetWork-Firwalld配置(一)
    04-09
    02
    AWS NAT-NetWork-Firwalld配置(二)
    04-09
    03
    kubernetes部署minio对象存储
    01-18
    更多文章>
    Theme by Vdoing | Copyright © 2019-2024 Bruce Tao Blog Space | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式