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
    目录

    select语句

    # select语句

    select是Go中的一个控制结构.select语句类似于switch语句,但是select会随机执行一个可运行的case.如果没有case可运行,它将阻塞,直到有case可运行.

    # 一、语法结构

    select语句的语法结构和switch语句很相似,也有case语句和default语句

    select {
    	case communication clause :
        	statement(s);
    	case communication clause :
        	satement(s);
        /* 可以定义任意数量的 case */
        default : /* 可选 */
        statement(S);
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    说明:

    • 每个case都必须是一个通信
    • 所有channel表达式都会被求值
    • 所有被发送的表达式都会被求值
    • 如果有多个case都可以运行,select会随机公平地选出一个执行.其他不会执行.
    • 否则
      • 如果有default子句,则执行该语句
      • 如果没有default子句,select将阻塞,直到某个通信可以运行: Go不会重新对channel或值进行求值.

    # 二、示例代码

    • select就是给通道来使用的,主要是用来监听通道上的数据流动.

    示例代码1

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	/*
    		分支语句: if,switch, select
    		select语句类似于switch语句
    			但是select语句随机执行一个可运行case
    			如果没有case可以运行,要看是否有default,如果有就执行default,否则就进入阻塞,直到有case可以运行.
    	*/
    
    	ch1 := make(chan int)
    	ch2 := make(chan int)
    
    	go func() {
    		time.Sleep(3 * time.Second)
    		ch1 <- 100
    	}()
    
    	go func() {
    		time.Sleep(3 * time.Second)
    		ch2 <- 200
    	}()
    	select {
    	case num1 := <-ch1:
    		fmt.Println("ch1中获取的数据...", num1)
    	case num2, ok := <-ch2:
    		if ok {
    			fmt.Println("ch2中读取的数据...", num2)
    		} else {
    			fmt.Println("ch2通道已经关闭...")
    		}
    	default:
    		fmt.Println("default语句...") //当上面两个case语句被阻塞的时候,就会默认执行default语句
    	}
    	fmt.Println("main...over...")
    }
    
    
    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
    40
    41
    42

    执行结果

    image-20221125133717216

    示例代码2

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	ch3 := make(chan int)
    	ch4 := make(chan int)
    
    	go func() {
    		time.Sleep(3 * time.Second)
    		ch3 <- 100
    	}()
    
    	select {
    	case <-ch3:
    		fmt.Println("case1可以执行...")
    	case <-ch4:
    		fmt.Println("case2可以执行...")
    	case <-time.After(3 * time.Second):
    		fmt.Println("case3执行...timeout...")
    		//default:
    		//	fmt.Println("执行了default...")
    	}
    }
    
    
    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

    执行结果

    image-20221125133701281

    上次更新: 2024/04/09, 16:48:42
    time包中的通道相关函数
    CSP并发模型

    ← time包中的通道相关函数 CSP并发模型→

    最近更新
    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
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式