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
0
投稿
猜你喜欢
- 分享一下 在3est活动中学习的godlong的 代码如下:<% Set xPost = createObject("Mi
- MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由
- 当需要制作转动鼠标滚轮放大页面字体这样的交互效果时,会用到 Mousewheel 事件。其实在大多数浏览器(IE6, IE7, IE8, O
- 推荐阅读:Oracle读取excel数据oracle导出excel(非csv)的方法有两种,1、使用sqlplus spool,2、使用包体
- 为了方便使用分类,我定义了一个分类表category,里面字段是id(自动编号) cat_name(分类名) pare
- aspjpeg组件实现加水印函数的调用方法: <%printwater "/images/水印图片.gif",&q
- 由于内容过多,大家可以通过ctrl+F搜索即可IE浏览器id 后缀名 php识别出的文件类型0 gif image/gif1 jpg ima
- 如何让你的CSS代码更具有组织性和易维护性,为什么你的样式表总是臃肿和混乱的?有些时候是源于一开始书写时的混乱和草率,有时候也是因为后期的维
- Dreamweaver MX 2004新增加了表格宽度辅助线功能,让我们在编辑网页表格的时候能清楚地看到表格中各单元的宽度以及变化,很直观。
- 块级元素块级元素生成一个元素框,(默认地)它会填充其父级元素的内容,旁边不能有其他元素。换句话说,他在元素框之前和之后生成了“分隔”符。我们
- 简介模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网站的升级
- 首先,我们会document里添加mouseover事件时在HTMLElement上飘一个absolute的容器,设置border。接着,m
- 结合这个例子分析一下结果:结合以往C语言的基础,画了一张图来解释为什么会有上面这些值的出现。先查看下Go中的这两个运算符是啥吧。①对于所有带
- 这篇论坛文章着重介绍了Access数据库出现0x80004005问题的解决方法,更多内容请参考下文:项目做了三个月了,终于也差不多完成了,昨
- 扪心自问,你真正了解你卖给用户的是什么玩意么?你所认为革命性的,一定会震惊世界的功能、特色,用户真的买单么?我的意思是,我们总是习惯性的忘记
- 一、读者指引 读者指引帮助你掌握本文的梗概。以免你看了大半才明白这编文章不适合你,给你造成视觉污染。如果你正在用ASP+XML写一些程序,或
- 类型主要针对文本属性进行定义。理解“编辑字体列表”和“行高”。二、CSS规则定义之“背景”·背景有背景颜色和背景图像的选择设置。·利于背景图
- 概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界.梯度运算梯度:
- 代码如下:--CAST 和 CONVERT 函数 Percentage DECLARE @dec decimal(5,3), @var va
- 1、取得控制台应用程序的根目录方法 方法1、Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径