首页 » SEO优化 » php断定case技巧_selectcase语句详解

php断定case技巧_selectcase语句详解

访客 2024-12-05 0

扫一扫用手机浏览

文章目录 [+]

select 语句类似于 switch 语句, 但是select会随机实行一个可运行的case。
如果没有case可运行, 它将壅塞, 直到有case可运行。

select 是Go中的一个掌握构造, 类似于用于通信的switch语句。
每个case必须是一个通信操作, 要么是发送要么是吸收。

php断定case技巧_selectcase语句详解

select 随机实行一个可运行的case。
如果没有case可运行, 它将壅塞, 直到有case可运行。
一个默认的子句该当总是可运行的。

php断定case技巧_selectcase语句详解
(图片来自网络侵删)

语法:

select { case communication clause : statement(s); case communication clause : statement(s); / 你可以定义任意数量的 case / default : / 可选 / statement(s);}

以下描述了 select 语句的语法:

每个case都必须是一个通信

所有channel表达式都会被求值

所有被发送的表达式都会被求值

如果任意某个通信可以进行, 它就实行;其他被忽略。

如果有多个case都可以运行, Select会随机公正地选出一个实行。
其他不会实行。

否则:

如果有default子句, 则实行该语句。

如果没有default字句, select将壅塞, 直到某个通信可以运行;Go不会重新对channel或值进行求值。

package mainimport "fmt"func main() { var c1, c2, c3 chan int var i1, i2 int select { case i1 = <-c1: fmt.Printf("received ", i1, " from c1\n") case c2 <- i2: fmt.Printf("sent ", i2, " to c2\n") case i3, ok := (<-c3): // same as: i3, ok := <-c3 if ok { fmt.Printf("received ", i3, " from c3\n") } else { fmt.Printf("c3 is closed\n") } default: fmt.Printf("no communication\n") }}

以上代码实行结果为:

no communication

select可以监听channel的数据流动

select的用法与switch语法非常类似, 由select开始的一个新的选择块, 每个选择条件由case语句来描述

与switch语句可以选择任何利用相等比较的条件比较, select由比较多的限定, 个中最大的一条限定便是每个case语句里必须是一个IO操作

select { //一直的在这里检测case <-chanl : //检测有没有数据可以读//如果chanl成功读取到数据,则进行该case处理语句case chan2 <- 1 : //检测有没有可以写//如果成功向chan2写入数据,则进行该case处理语句//如果没有default,那么在以上两个条件都不成立的情形下,就会在此壅塞//一样平常default会不写在里面,select中的default子句总是可运行的,由于会很花费CPU资源default://如果以上都没有符合条件,那么则进行default处理流程}

在一个select语句中, Go会按顺序从头到尾评估每一个发送和吸收的语句。

如果个中的任意一个语句可以连续实行(即没有被壅塞), 那么就从那些可以实行的语句中任意选择一条来利用。

如果没有任意一条语句可以实行(即所有的通道都被壅塞), 那么有两种可能的情形:

1 如果给出了default语句, 那么就会实行default的流程, 同时程序的实行会从select语句后的语句中规复。

2 如果没有default语句, 那么select语句将被壅塞, 直到至少有一个case可以进行下去。

Golang select的利用及范例用法

基本利用

select是Go中的一个掌握构造, 类似于switch语句, 用于处理异步IO操作。
select会监听case语句中channel的读写操作, 当case中channel读写操作为非壅塞状态(即能读写)时,将会触发相应的动作。

select中的case语句必须是一个channel操作

select中的default子句总是可运行的。

如果有多个case都可以运行, select会随机公正地选出一个实行, 其他不会实行。

如果没有可运行的case语句, 且有default语句, 那么就会实行default的动作。

如果没有可运行的case语句, 且没有default语句, select将壅塞, 直到某个case通信可以运行

例如:

package mainimport "fmt"func main() {var c1, c2, c3 chan intvar i1, i2 intselect {case i1 = <-c1:fmt.Printf("received ", i1, " from c1\n")case c2 <- i2:fmt.Printf("sent ", i2, " to c2\n")case i3, ok := (<-c3): // same as: i3, ok := <-c3if ok {fmt.Printf("received ", i3, " from c3\n")} else {fmt.Printf("c3 is closed\n")}default:fmt.Printf("no communication\n")}}//输出:no communication

范例用法

1.超时判断

//比如不才面的场景中,利用全局resChan来接管response,如果韶光超过3S,resChan中还没有数据返回,则第二条case将实行

package mainimport ("fmt""time")var resChan = make(chan int)// do requestfunc main() {select {case data := <-resChan:doData(data)case <-time.After(time.Second 3): // 超时判断fmt.Println("request time out")}}func doData(data int) {fmt.Println(data)}

2.退出

//主线程(协程)中如下:var shouldQuit=make(chan struct{})fun main(){{//loop}//...out of the loopselect {case <-c.shouldQuit:cleanUp()returndefault:}//...}//再其余一个协程中,如果运行碰着造孽操作或不可处理的缺点,就向shouldQuit发送数据关照程序停滞运行close(shouldQuit)

3.判断channel是否壅塞

//在某些情形下是存在不肯望channel缓存满了的需求的,可以用如下方法判断ch := make (chan int, 5)//...data:=0select {case ch <- data:default://做相应操作,比如丢弃data。
视需求而定}

4 select...case 匹配多个通道问题?

package mainimport ("fmt""time")func main() {timeout := make(chan bool, 1)ch := make(chan int)go func() {time.Sleep(1 time.Second)timeout <- true}()go func() {time.Sleep(13 time.Second)ch <- 1}()// select...case 专门用于匹配通道select {// 这里是匹配两个通道, 是分开实行的,不是匹配两个值的效果(不同于PHP、js的语法效果)case <-ch:// fmt.Println("ch 通道")case <-timeout:fmt.Println("timeout!")}/// select case 无法匹配两个通道, 是缺点的语法// switch...case 可以匹配多个值(非通道)select{case <-ch, <-timeout:fmt.Println("timeout")}/}

标签:

相关文章

我国土地利用分类代码的构建与应用

土地利用分类代码是我国土地管理的重要组成部分,是土地资源调查、规划、利用和保护的依据。土地利用分类代码的构建与应用显得尤为重要。本...

SEO优化 2025-02-18 阅读1 评论0

微信跳转微信支付便捷支付体验的秘密武器

移动支付已成为人们日常生活中不可或缺的一部分。作为我国领先的社交平台,微信支付凭借其便捷、安全的支付方式,深受广大用户的喜爱。而微...

SEO优化 2025-02-18 阅读1 评论0

探寻会计科目代码背后的奥秘分类与

会计科目代码是会计信息系统中不可或缺的组成部分,它将企业的经济活动进行分类和归纳,为会计核算、财务分析和决策提供重要依据。本文将从...

SEO优化 2025-02-18 阅读1 评论0