Go流程控制代码详解
作者:教练我写不出来 发布时间:2023-09-01 10:21:12
标签:Go,流程控制
Go流程控制
1、条件语句IF
1、简单格式(不支持三目运算符)
if 布尔表达式 {
// 执行语句
}
2、if里面包含多个表达式的时候,使用‘;'隔开
2、条件语句switch
1、var1可以是任何类型,value1和value2可以是同类型的人和值
switch var1 {
case value1:
xxx
case value2:
xxx
default:
yyy
}
1、Type Switch
switch还可以被用于type-switch来判断某个interface变量中实际存储的变量类型
switch x.(type) {
case type:
statement(s)
case type:
statement(s)
default:
statement(s)
}
3、条件语句select
select语句类似switch语句,但select会随机执行一个可运行的case,如果没有case可运行,它将阻塞,直到有case可运行。
select {
case communication clause :
statement(s)
case communication clause :
statement(s)
default:
statement(s)
}
// 解释:每个case必须是一个通信,所有的channel表达式都会被求值,所有被发送的表达式都会被求值,
// 1、如果任意某个通信可以执行,就执行,其余忽略
// 2、如果有多个case可以执行,select随机且公平的选出一个执行
// 3、否则:如果有default语句,执行;没有default,select将阻塞,直到某个通信可以运行,Go不会重新对Channel或值进行求职
1、golang select的使用以及典型用法
1、基本使用:
用于处理异步IO操作,select会监听case语句中的channel的读写操作,当case中channel读写操作为非阻塞状态,将触发相应的动作。(case语句必须是channel操作)
2、典型用法:
1)超时判断
//比如在下面的场景中,使用全局resChan来接受response,如果时间超过3S,resChan中还没有数据返回,则第二条case将执行
var resChan = make(chan int)
// do request
func test() {
select {
case data := <-resChan:
doData(data)
case <-time.After(time.Second * 3):
fmt.Println("request time out")
}
}
func doData(data int) {
//...
}
2)退出
//主线程(协程)中如下:
var shouldQuit=make(chan struct{})
fun main(){
{
//loop
}
//...out of the loop
select {
case <-c.shouldQuit:
cleanUp()
return
default:
}
//...
}
//再另外一个协程中,如果运行遇到非法操作或不可处理的错误,就向shouldQuit发送数据通知程序停止运行
close(shouldQuit)
3)判断channel是否阻塞
//在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断
ch := make (chan int, 5)
//...
data:=0
select {
case ch <- data:
default:
//做相应操作,比如丢弃data。视需求而定
}
4、循环语句for
for init; condition; post {}
for condition {}
for {}
// 解释:1)init一般为赋值表达式,给控制变量赋初始值;2)condition:关系表达式或逻辑表达式,循环控制条件;3)post:一般为赋值表达式,给控制变量增量或减量
// 执行流程:判别赋值表达式init是否满足condition给定的条件,若为真,则执行循环语句,然后执行post,进入第二轮循环
5、循环语句range
for key, value := range oldMap {
newMap[key] = value
}
for 和 for range 有什么区别?
1、使用场景:
1)for可以遍历array、slice、key为整形递增的map、string
2)for range 可以完成for所有事情,却能做for不能做的事情,包括遍历key为string类型的map、遍历channel
6、循环控制goto、break、…
Goto、Break、Continue
1、三个语句都可以配合标签(label)使用
2、标签名区分大小写,定义后若不是用会造成编译错误
3、continue、break配合标签(label)可以用于多层循环跳出
4、goto调整执行位置,与continue、break配合标签(label)的结果并不相同
来源:https://blog.csdn.net/qq_45151059/article/details/130241523


猜你喜欢
- python怎么模拟点击网页按钮前提环境: Python3 和 Visual Studio Code安装完毕安装selenium : 在终端
- 今天在写vue项目时,用到了computed计算属性,遇到了使用箭头函数出现this指向问题,这里记录下1.箭头函数中的this箭头函数内部
- 这篇文章主要介绍了JavaScript回调函数callback用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 本文实例为大家分享了js通过开始结束控制计时器的具体实现代码,供大家参考,具体内容如下时间戳的使用的可以取消对多次点击事件产生效果的累加,譬
- eval(“1+2”),-> 3 动态判断源代码中的字符串是一种很强大的语
- 绪论java默认精度是毫秒级别的,生成的时间戳是13位,而python默认是10位的,精度是秒。那么python是如何生成13位时间戳,以及
- /* --注意:准备数据(可略过,非常耗时) CREATE TABLE CHECK1_T1 ( ID INT, C1 CHAR(8000)
- 本文实例讲述了smarty模板引擎从配置文件中获取数据的方法。分享给大家供大家参考。具体如下:当某个变量值,不希望在程序中写死时,就可以把该
- 本文实例为大家分享了python实现人脸签到系统的具体代码,供大家参考,具体内容如下简易版人脸签到/签退系统管理员可进行录入人脸操作,以及导
- 游戏规则用pygame动画实现神庙逃亡类似的小游戏,当玩家移动的时候躲避 * ,如果 * 命中玩家或者名字龙都会减速,玩家躲避 * 使更多的 * 打
- 前几篇都是手动录入或随机函数产生的数据。实际有许多类型的文件,以及许多方法,用它们从文件中提取数据来图形化。比如之前python基础(12)
- 该方是基于uiautomator2如下版本进行验证的:PS C:\windows\system32> pip show uiautom
- 使用opencv将图片转为灰度图主要有两种方法,第一种是将彩色图转为灰度图,第二种是在使用OpenCV读取图片的时候直接读取为灰度图。将彩色
- 在默认情况下,MySQL搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE
- 一、简单使用入门小案例import logginglogging.basicConfig(level=logging.DEBUG, &nbs
- 本文实例讲述了python飞机大战pygame游戏背景设计。分享给大家供大家参考,具体如下:目标背景交替滚动的思路确定显示游戏背景01. 背
- 前言设置mysql最大连接数的方法:首先打开mysql的控制台;然后输入语句【set GLOBAL max_connections=1000
- 用ASP.NET与SQL SERVER可是缘份最好了,稍大的程序一般第一先考虑的是SQL SERVER,只是一些很考虑经济的才使用ACCES
- 互联网充斥着枯燥的设计,惠普、IBM、戴尔、微软,以及其他数不尽的网站(相似的布局,相似的配色)。可能有人会说通过这样一种标准化的界面可以使
- 一、破解原理其实原理很简单,一句话概括就是「大力出奇迹」,Python 有两个压缩文件库:zipfile 和 rarfile,这两个库提供的