这篇文章主要讲解了“Golang中的流程控制有哪些及怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中的流程控制有哪些及怎么实现”吧!Go语言基础之流程控制主要包括以下内容:条件语句if条件语句switch条件语句select循环语句for循环语句range循环控制Goto、Break、ContinueGo语言中if
条件判断的格式如下:
if表达式1{ 分支1 }elseif表达式2{ 分支2 }else{ 分支3 }
前端的同学想必对js相对熟悉,相对于js来说,go表达式去掉了括号()
,但同时给了一些约束,与if
匹配的左括号{
必须与if和表达式
放在同一行,{
放在其他位置会触发编译错误。 同理,与else
匹配的{
也必须与else
写在同一行,else
也必须与上一个if
或else if
右边的大括号在同一行。
x:=0 //ifx>10//Error:missingconditioninifstatement //{ //} ifn:="abc";x>0{//初始化语句未必就是定义变量,如println("init")也是可以的。 println(n[2]) }elseifxb?a:b"。 packagemain import"fmt" funcmain(){ /*定义局部变量*/ varaint=10 /*使用if语句判断布尔表达式*/ ifa
switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。 Golang switch 分支表达式可以是任意类型,不限于常量。可省略 break,默认自动终止。
packagemain import"fmt" funcmain(){ /*定义局部变量*/ vargradestring="B" varmarksint=90 switchmarks{ case90:grade="A" case80:grade="B" case50,60,70:grade="C" default:grade="D" } switch{ casegrade=="A": fmt.Printf("优秀!n") casegrade=="B",grade=="C": fmt.Printf("良好n") casegrade=="D": fmt.Printf("及格n") casegrade=="F": fmt.Printf("不及格n") default: fmt.Printf("差n") } fmt.Printf("你的等级是%sn",grade) } 以上代码执行结果为: 优秀! 你的等级是A
select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。select 是Go中的一个控制结构,类似于用于通信的switch语句。每个case必须是一个通信操作,要么是发送要么是接收。 select 随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。一个默认的子句应该总是可运行的。以下描述了 select 语句的语法:
每个case都必须是一个通信 所有channel表达式都会被求值 所有被发送的表达式都会被求值 如果任意某个通信可以进行,它就执行;其他被忽略。 如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行。 否则: 如果有default子句,则执行该语句。 如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。
packagemain import"fmt" funcmain(){ varc1,c2,c3chanint vari1,i2int select{ casei1=select可以监听channel的数据流动
select可以监听channel的数据流动
select的用法与switch语法非常类似,由select开始的一个新的选择块,每个选择条件由case语句来描述与switch语句可以选择任何使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作
select{//不停的在这里检测 case在一个select语句中,Go会按顺序从头到尾评估每一个发送和接收的语句。
在一个select语句中,Go会按顺序从头到尾评估每一个发送和接收的语句。
如果其中的任意一个语句可以继续执行(即没有被阻塞),那么就从那些可以执行的语句中任意选择一条来使用。 如果没有任意一条语句可以执行(即所有的通道都被阻塞),那么有两种可能的情况: ①如果给出了default语句,那么就会执行default的流程,同时程序的执行会从select语句后的语句中恢复。 ②如果没有default语句,那么select语句将被阻塞,直到至少有一个case可以进行下去。
//比如在下面的场景中,使用全局resChan来接受response,如果时间超过3S,resChan中还没有数据返回,则第二条case将执行 varresChan=make(chanint) //dorequest functest(){ select{ casedata:=
和if一样,相对于js,go语言的for循环也去掉了括号(),其他并没有太大的区别。
packagemain import"fmt" funcmain(){ varbint=15 varaint numbers:=[6]int{1,2,3,5} /*for循环*/ fora:=0;a
Golang range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:
forkey,value:=rangeoldMap{ newMap[key]=value }
登录后复制
packagemain funcmain(){ s:="abc" //忽略2ndvalue,支持string/array/slice/map。 fori:=ranges{ println(s[i]) } //忽略index。 for_,c:=ranges{ println(c) } //忽略全部返回值,仅迭代。 forranges{ } m:=map[string]int{"a":1,"b":2} //返回(key,value)。 fork,v:=rangem{ println(k,v) } } 输出结果: 97 98 99 97 98 99 a1 b2
for 和 for range有什么区别?
登录后复制for 和 for range有什么区别?
主要是使用场景不同for可以遍历array和slice,遍历key为整型递增的map,遍历stringfor range可以完成所有for可以做的事情,却能做到for不能做的,包括遍历key为string类型的map并同时获取key和value,遍历channel循环控制语句循环控制语句可以控制循环体内语句的执行过程。GO 语言支持以下几种循环控制语句:
1.三个语句都可以配合标签(label)使用 2.标签名区分大小写,定以后若不使用会造成编译错误 3.continue、break配合标签(label)可用于多层循环跳出 4.goto是调整执行位置,与continue、break配合标签(label)的结果并不相同
break(跳出循环)
:
continue(继续下次循环)break
语句可以结束for
、switch
和select
的代码块。break
语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的for
、switch
和 select
的代码块上。
break(跳出循环)
:
continue(继续下次循环)break
语句可以结束for
、switch
和select
的代码块。break
语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的for
、switch
和 select
的代码块上。 continue(继续下次循环)
:continue
语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for
循环内使用。在 continue
语句后添加标签时,表示开始标签对应的循环goto
语句通过标签
进行代码间的无条件跳转。goto
语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go语言中使用goto
语句能简化一些代码的实现过程。 例如双层嵌套的for循环要退出时:
funcgotoDemo1(){ varbreakFlagbool fori:=0;i使用
goto
语句能简化代码:
funcgotoDemo2免费云主机域名(){ fori:=0;i
使用goto
语句能简化代码:
感谢各位的阅读,以上就是“Golang中的流程控制有哪些及怎么实现”的内容了,经过本文的学习后,相信大家对Golang中的流程控制有哪些及怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
这篇文章主要介绍“Angular的Directive指令怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Angular的Directive指令怎么使用”文章能帮助大家解决问题。Directive 用来修饰 DOM…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。