golang 流程控制

Go语言的流程控制主要分为三大类:

1.条件判断
2.循环控制
3.无条件跳转

条件判断

Go语言的条件判断由if ... else if ... else 语句实现,条件表达式值必须是布尔类型,可省略圆括号,但是花括号不能省略且左花括号不能另起一行,比如:

if7%2==0{ fmt.Println("7iseven") }else{ fmt.Println("7isodd") } if8%4==0{//可以没有else只有if语句 fmt.Println("8isdivisibleby4") }

Go语言比较特别的是在条件判读语句中支持初始化语句,允许定义局部变量,但是这个变量的作用域仅限于该条件逻辑块内,比如:

ifnum:=9;num<0{ fmt.Println(num,"isnegative") }elseifnum<10{ fmt.Println(num,"has1digit") }else{ fmt.Println(num,"hasmultipledigits") }

最典型的应用就是字典的查找:

ifv,ok:=map1[key1];ok{ ... }

优化建议:

  1. 对于那些过于复杂的组合条件判断,建议独立出来封装成函数,将流程控制和实现细节分离,使你的代码更加模块化,提高可读性.

  2. 有些时需要写很多的if-else实现一些复杂的逻辑处理,这时代码看上去就很罗嗦很冗长,而且也不易于以后的维护,用switch...case来很好的解决这个问题.


switch...case

switch与if类似,也用于选择执行,执行的过程从上至下顺序匹配各个case,基本用法如下:

switchsExpr{ caseexpr1: someinstructions caseexpr2: someotherinstructions caseexpr3: someotherinstructions default: othercode }

switch中的表达式可以不是常量或字符串,甚至可以�]有表达式,若没有表达式则匹配true,如同if-else if-else,与 其它编程语言的switch用法基本相同,不同的是在每个case中隐藏了break,不过也可以显示加入break。 当case匹配成功后,处理当前case的处理逻辑,正常情况下,处理完成后就跳出整个switch,但这不是绝对的, 可以使用fallthrough强迫程序执行后面的case; 如果没有任何case匹配成功,则执行default逻辑,比如:

免写break:

{
i:=2
switchi{//将i与case条件匹配
case1:
fmt.Println("one")//break没有实际意义,直接跳出switch
case2:
fmt.Println("two")
case3:
fmt.Println("three")
}
}

多表达式判断:

{
switchtime.Now().Weekday(){
casetime.Saturday,time.Sunday://在同一个case中可以写多个表达式,它们之间是逻辑或的关系
fmt.Println("it'stheweekend")
default:
fmt.Println("it'saweekday")
}
}

无表达式:

{
t:=time.Now()
switch{//没有表达式,相当于if-else
caset.Hour()<12:
fmt.Println("it'sbeforenoon")
default:
fmt.Println("it'safternoon")
}
}

fallthrough:

{
i:=2
switchi{
case1:
fmt.Println("one")
case2:
fmt.Println("two")
fallthrough//使用fallthrough强迫程序执行后面的case
case3:
fmt.Println("three")
}
}

循环控制

for是Go语言中仅有的一种循环语句,下面是常见的三种用法:

forj:=7;j<=9;j++{//典型的用法initial/condition/after
fmt.Println(j)
}

i:=1
fori<=3{//类似while(i<=3){}或for;i<=3;;{}
fmt.Println(i)
i=i+1
}

for{//类似while(true){}或fortrue{}
fmt.Println("loop")
...
break
}

PS:初始化语句只会被执行一次,并且初始化表达式支持函数调用或定义局部变量

在日常开发中for经常与range搭配,for...range被用来遍历字符串、数组、切片、字典和通道等,返回索引和键值数据,比如:

{fori,c:=range"go"{//rangestring
fmt.Println(i,c)
}

nums:=[]int{2,3,4}
fori,num:=rangenums{//rangearray/slice
fmt.Println(i,":",num)
}

kvs:=map[string]string{"a":"apple","b":"banana"}
fork,v:=rangekvs{//rangemap
fmt.Printf("%s->%s\n",k,v)
}

chs:=make(chanint,10)//rangechannel
chs<-1
chs<-2
close(chs)
forv:=rangechs{
fmt.Println(v)
}
}

简单归纳如下:

data type first value second value
string index s[index]
array/slice index v[index]
map key value
channel element


无条件跳转

Go语言有三种跳转类型,分别是 continue,break,goto

continue:仅用于for循环内部,终止本次循环,立即进入下一轮循环
break:用于for循环,switch,select语句,终止整个语句块的执行
goto:定点跳转,但不能跳转到其他函数或内层代码块内

看下面的例子:

funcover(){
over://labeloverdefinedandnotused
println("callover")
}
funcmain(){
rand.Seed(time.Now().UnixNano())
for{
loop:
x:=rand.Intn(100)//获取一个100以内的随机数
ifx%2==0{
continue//终止本次循环,立即进入下一轮循环
}
ifx>50{
break//终止整个语句块的执行
}
println(x)
}
gotoover//labelovernotdefined
gotoloop//gotoloopjumpsintoblockstarting}

goto 的习惯用法:

{
f,err:=os.Open("/tmp/dat")
iferr!=nil{
....
gotoexit
}
...
n1,err:=f.Read(b1)
iferr!=nil{
gotoend
}
...

end:
println("clearresourceandexit")
f.close()
exit:
return
}

借鉴: 雨痕<GO学习笔记>

讨论学习: 675020908

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


类型转换 1、int转string 2、string转int 3、string转float 4、用户结构类型转换
package main import s &quot;strings&quot; import &quot;fmt&quot; var p = fmt.Println func main() { p(&quot;Contains: &quot;, s.Contains(&quot;test&quo
类使用:实现一个people中有一个sayhi的方法调用功能,代码如下: 接口使用:实现上面功能,代码如下:
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件信息 4、删除文件,成功返回true,失败返回false
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http://www.golangtc.com/downloadBeego开发文档地址:http://beego.me/docs/intro/ 安装步骤: 一、GO环境安装 二、配置系统变量 三、Beego安装 一、GO环境安装 根
golang获取程序运行路径:
Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考