流程控制(条件语句)
💥本文章所有相关go代码参考自go 1.18+版本
if
语句
if
语句后紧跟一个或多个语句组成,注意布尔表达式不能用0
或1
。- 如果表达式求值为
true
,则执行"if"
分支,否则执行"else"
分支。 GoLang
不支持三目运算a > b ? a : b
,官方的解释是三目运算会导致复杂的表达式。
|
|
- 由于
if
和switch
都接受初始化语句,因此通常会看到用于设置局部变量的语句。- 该语句在计算表达式之前执行。
if
和else if
后都可以跟【Init; expr
】语句。
|
|
|
|
- 当
if
语句没有进入下一个语句,即正文以break
、continue
、goto
或return
结尾时,省略不必要的else
。
|
|
break
语句
- 一个
break
的作用范围为该语句出现的最内部的结构,它可以用于任何形式的for
循环。 - 在
switch
或select
语句中,break
语句的作用是跳过整个代码块,继续执行switch
或select
外后续的代码。 - 语句中如果有标签,则必须是包含
for
、switch
或select
语句的标签。并且该标签是可以执行终止的。 break
两个作用:- 针对
for
关键字结束循环。 - 针对
switch
、select
关键字跳出整个代码块。但switch
和select
的case
后是默认自带break
,如果显示写上也只是跳出switch
和select
块。
- 针对
break
在switch
中可以作为if
分支结束条件。
|
|
- 因此在
switch
或select
块中使用break
关键字只能跳出【当前】switch
或select
块。如果想跳出外层for
循环则需要break Label
加上标签名称。
|
|
- 注意
break label; label
(标签)只能是之前出现的,continue
关键字也是。但是goto
关键字却可以跳转到后面的标签处。
continue
语句
- 关键字
continue
用在关键字for
(结束本次循环,继续下次循环),但不是无条件执行下一次循环,执行之前依旧需要满足循环的判断条件。 - 如果有一个标签,那么它必须是一个封闭的
for
语句,并且是当前执行进程的标签。
|
|
- 使用示例:
|
|
标签
for
、switch
、select
语句都可以配合标签(label
)形式的标识符使用。标签可以在代码的任何地方(函数体内)。- 即某一行第一个可以冒号(
:
)结尾的单词(Gofmt
会将后续代码自动移至下一行) - 标签的名称是大小写敏感的,为了提升可读性(可以首字母大小,可读性比较高就行)。
- 即某一行第一个可以冒号(
|
|
- 标签用于
break
、continue
、goto
语句,定义从未使用的标签是非法的,不能编译成功。(定义了标签一定要使用)
goto
语句
goto
语句是跳转到具体有相同函数内相应标签的语句。(结合标签使用,通常用在一些公共代码部分或循环逻辑处)
|
|
Go
语言不鼓励多层嵌套使用标签和goto
语句,因为它们会导致非常糟糕的程序设计,而且总有更加可读的替代方案来实现相同得需求。- 块外的
goto
语句不能跳转到该块内的标签。(只能平级跳或跳出到外层块)
|
|
goto
语句是可以跳转到后面出现的标签的,前提是满足块外的goto
语句不能跳转到块内的标签。
|
|
goto
多用于跳转到前面代码的标签处,这样就形成了循环。
总结
goto
、break
、continue
:三个语句都可以配合标签(label
)使用。- 标签名区分大小写,定义后若不使用会造成编译错误。
continue
、break
配合标签(label
)可用于多层循环跳出。goto
是调整执行位置,与continue
、break
配合标签(label
)的结果并不相同。