判断语句

:::info 综述

:::

三种:

判断与循环语句 - 图1

注意:**Go 没有三目运算符,所以不支持 ?: 形式的条件判断。**

if语句

语法结构如下

  1. //语法结构1
  2. if 布尔表达式 {
  3. ...
  4. }
  5. //语法结构2
  6. if 布尔表达式 {
  7. ...
  8. } else {
  9. ...
  10. }
  11. //语法结构3
  12. if 布尔表达式 {
  13. ...
  14. } else if 布尔表达式 {
  15. ...
  16. } else {
  17. ...
  18. }
  19. //语法结构4——嵌套
  20. //你可以以同样的方式在 if 语句中嵌套 else if...else 语句
  21. if 布尔表达式 1 {
  22. ....
  23. if 布尔表达式 2 {
  24. ....
  25. }
  26. }

区别于c语言

  1. 条件无括号/有括号都可以
  2. c语言中,else if 和 else是可以单独一行,或者挨着一个{,但是go中却是}else{/ }else if {
  3. 持初始化语句,可定义代码块局部变量。

实例

  1. if n := "abc"; x > 0 { // 初始化语句未必就是定义变量, 如 println("init") 也是可以的。
  2. println(n[2])
  3. } else if x < 0 { // 注意 else if 和 else 左大括号位置。
  4. println(n[1])
  5. } else {
  6. println(n[0])
  7. }

switch语句

语法

  1. switch var1 {
  2. case val1:
  3. ...
  4. case val2:
  5. ...
  6. default:
  7. ...
  8. }

特点/与c语言的差别(4):

  1. 表达式var1
    1. 无括号
    2. 可省略
      若省略var1——则表达式varl1、varl2…由上至下,若为true则执行
      用来代替需要连续的判断的if-else语句
      判断与循环语句 - 图2
    3. 条件表达式不限制为常量或者整数
  2. switch 分支表达式——case
    1. 类型
      分支表达式** val1、val2、…可以是任何类型,但要求同类型**
      不论是什么类型,类型不被局限于常量或整数,但分支表达式必须是同类型,即便是表达式,其最终结果必须是同类型的任意值
    2. 单个case中可出现多个项
      您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3
      判断与循环语句 - 图3
  3. 关于break
    1. switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。默认自带break
    2. 如果我们需要执行后面的 case,可以使用 fallthrough
  4. 最后不一定得是default
  1. package main
  2. import "fmt"
  3. func main() {
  4. /* 定义局部变量 */
  5. var grade string = "B"
  6. switch {
  7. case grade == "A" :
  8. fmt.Printf("优秀!\n" )
  9. case grade == "B", grade == "C" :
  10. fmt.Printf("良好\n" )
  11. case grade == "D" :
  12. fmt.Printf("及格\n" )
  13. case grade == "F":
  14. fmt.Printf("不及格\n" )
  15. default:
  16. fmt.Printf("差\n" );
  17. }
  18. fmt.Printf("你的等级是 %s\n", grade );
  19. }

判断与循环语句 - 图4

与c语言的差别

基本上上面特性写的都是差别,这里放一个格式,对比看看

  1. // 第一种:表达式与case相匹配,跳到该行,然后依次执行该行以下的语句
  2. switch (表达式)
  3. {
  4. case 常量表达式 1: 语句或程序块;
  5. case 常量表达式 2: 语句或程序块;
  6. ……
  7. case 常量表达式 n:语句或程序块;
  8. default: 语句或程序块;
  9. }
  10. //第二种:表达式与case相匹配,跳到该行,只执行该行,然后跳出
  11. switch (表达式)
  12. {
  13. case 常量表达式 1: 语句或程序块;break;
  14. case 常量表达式 2: 语句或程序块;break;
  15. ……
  16. case 常量表达式 n:语句或程序块;break;
  17. default: 语句或程序块;
  18. }
  19. //第三种:以上两种混合
  • 同:
    • 都是判断表达式==常量表达式
  • 不同
    • 省略:c语言的switch(表达式)的表达式不可省略
    • break:c语言的带break=go语言带或者不带break
    • case:c语言后必须是常量表达式

?Type swich

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。(???) Type Switch 语法格式如下:
  1. switch x.(type){
  2. case type:
  3. statement(s);
  4. case type:
  5. statement(s);
  6. /* 你可以定义任意个数的case */
  7. default: /* 可选 */
  8. statement(s);
  9. }

实例

判断与循环语句 - 图5

fallthrough

使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。

判断与循环语句 - 图6

select语句

涉及到通道channel,会在并发编程那里解决

循环语句

对,你没看错,只有for,注意三个循环控制语句,和for…range

:::info 综述

:::

  1. 循环控制语句——for循环(包括for循环嵌套+无限循环)
  2. 循环控制语句
    判断与循环语句 - 图7
  3. 无限循环

!逻辑分析

for i:=0; i **<font style="color:#AD1A2B;"><</font>** len(nums); i++ for i:=0; i **<font style="color:#AD1A2B;"><=</font>** len(nums); i++
有计数器参与循环代码中,计数器i的范围是? **[0,len(nums)-1]** **或者 `[0, len(nums))**` **[0, len(nums)]**
计数器最终i=? len(nums) len(nums)+1
循环执行了多少次? len(nums) len(nums)+1
for i:=m; i **<font style="color:#AD1A2B;"><</font>** index; i++ for i:=m; i **<font style="color:#AD1A2B;"><=</font>** index; i++
有计数器参与循环代码中,计数器i的范围是? **[m ,index-1]** **或者 `[m, index)**` **[m, index]**
计数器最终i=? index index+1
循环执行了多少次? index - m index - m +1
  • 因触发循环判断条件而循环终止,故最终计数器的数值一定不满足循环条件;但是有计数器参与循环代码中,计数器**<font style="color:#AD1A2B;">i</font>**最大数,一定没有超出循环条件,且逼近
  • 两者差一个计数器单位

for循环

语法

类比(c语言)
<font style="color:rgb(0, 0, 136);">for</font><font style="color:rgb(0, 0, 0);"> init</font><font style="color:rgb(102, 102, 0);">;</font><font style="color:rgb(0, 0, 0);"> condition</font><font style="color:rgb(102, 102, 0);">;</font><font style="color:rgb(0, 0, 0);"> post </font><font style="color:rgb(102, 102, 0);">{</font><font style="color:rgb(0, 0, 0);"> </font><font style="color:rgb(102, 102, 0);">}</font> 和 C 语言的 for 一样 (init 和 post 参数是可选的,我们可以直接省略它)
<font style="color:rgb(0, 0, 136);">for</font><font style="color:rgb(0, 0, 0);"> condition </font><font style="color:rgb(102, 102, 0);">{</font><font style="color:rgb(0, 0, 0);"> </font><font style="color:rgb(102, 102, 0);">}</font> 和 C 的 while 一样:
<font style="color:rgb(0, 0, 136);">for</font><font style="color:rgb(0, 0, 0);"> </font><font style="color:rgb(102, 102, 0);">{</font><font style="color:rgb(0, 0, 0);"> </font><font style="color:rgb(102, 102, 0);">}</font> 无限循环
1. 和 C 的 for(;;) 一样:
2. 和c的 while (true) {} 一样
其中:
  • init: 一般为赋值表达式,给控制变量赋初值;
  • condition: 关系表达式或逻辑表达式,循环控制条件;
  • post: 一般为赋值表达式,给控制变量增量或减量。

执行顺序——和c语言一样

和c语言的差别

  1. 对比上下文即可知,go的for = c语言的for + whlie
  2. C语言的for是不可以省略();的,但go语言可随时省略(),在无initpost的时候可省略;
  1. for (表达式1; 表达式2; 表达式3){
  2. 循环体
  3. }

:::info go语言实例

:::

  1. 实例1
    判断与循环语句 - 图8
  2. 实例2
    判断与循环语句 - 图9

无限循环

要停止无限循环,可以在命令窗口按下ctrl-c

判断与循环语句 - 图10

For-each range 循环

后面有一个章节专门讲for…range结构

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。
  1. //基本格式
  2. for key, value := range 迭代体名 {
  3. 循环体
  4. }
  5. //只要key
  6. for key := range 迭代体名{
  7. 循环体
  8. }
  9. //只要key还可以这样写
  10. for key:_= range 迭代体名{
  11. 循环体
  12. }
  13. //只要value
  14. for _, value := range 迭代体名{
  15. 循环体
  16. }

嵌套循环

只要弄清逻辑和格式就行

循环控制语句

break

和c一样,这里只提一件事情,就是标记的break

判断与循环语句 - 图11

判断与循环语句 - 图12

continue

可以用标号 label 标出想 continue 的循环。一定要对比一下标号label的break和continue 判断与循环语句 - 图13 判断与循环语句 - 图14 #### goto语句 功能: Go 语言的 goto 语句可以无条件地转移到过程中指定的行。goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。 但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

:::info 语法

:::

两个语句谁前谁后都可以

  1. goto label;//开始跳跃
  2. ..
  3. .
  4. label: statement;//跳到的位置

判断与循环语句 - 图15

实例

判断与循环语句 - 图16

判断与循环语句 - 图17

应用

利用函数的多返回值 + if语句

判断与循环语句 - 图18