判断语句
:::info 综述
:::
三种:

注意:**Go 没有三目运算符,所以不支持 ?: 形式的条件判断。**
if语句
语法结构如下
//语法结构1if 布尔表达式 {...}//语法结构2if 布尔表达式 {...} else {...}//语法结构3if 布尔表达式 {...} else if 布尔表达式 {...} else {...}//语法结构4——嵌套//你可以以同样的方式在 if 语句中嵌套 else if...else 语句if 布尔表达式 1 {....if 布尔表达式 2 {....}}
区别于c语言
- 条件无括号/有括号都可以
- c语言中,else if 和 else是可以单独一行,或者挨着一个{,但是go中却是
}else{/}else if { - 持初始化语句,可定义代码块局部变量。
实例
if n := "abc"; x > 0 { // 初始化语句未必就是定义变量, 如 println("init") 也是可以的。println(n[2])} else if x < 0 { // 注意 else if 和 else 左大括号位置。println(n[1])} else {println(n[0])}
switch语句
语法
switch var1 {case val1:...case val2:...default:...}
特点/与c语言的差别(4):
- 表达式var1
- 无括号
- 可省略
若省略var1——则表达式varl1、varl2…由上至下,若为true则执行
用来代替需要连续的判断的if-else语句
- 条件表达式不限制为常量或者整数
- switch 分支表达式——case
- 类型
分支表达式** val1、val2、…可以是任何类型,但要求同类型**
不论是什么类型,类型不被局限于常量或整数,但分支表达式必须是同类型,即便是表达式,其最终结果必须是同类型的任意值 - 单个case中可出现多个项
您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3
- 类型
- 关于break
- switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。默认自带break
- 如果我们需要执行后面的 case,可以使用 fallthrough 。
- 最后不一定得是default
package mainimport "fmt"func main() {/* 定义局部变量 */var grade string = "B"switch {case grade == "A" :fmt.Printf("优秀!\n" )case grade == "B", grade == "C" :fmt.Printf("良好\n" )case grade == "D" :fmt.Printf("及格\n" )case grade == "F":fmt.Printf("不及格\n" )default:fmt.Printf("差\n" );}fmt.Printf("你的等级是 %s\n", grade );}

与c语言的差别
基本上上面特性写的都是差别,这里放一个格式,对比看看
// 第一种:表达式与case相匹配,跳到该行,然后依次执行该行以下的语句switch (表达式){case 常量表达式 1: 语句或程序块;case 常量表达式 2: 语句或程序块;……case 常量表达式 n:语句或程序块;default: 语句或程序块;}//第二种:表达式与case相匹配,跳到该行,只执行该行,然后跳出switch (表达式){case 常量表达式 1: 语句或程序块;break;case 常量表达式 2: 语句或程序块;break;……case 常量表达式 n:语句或程序块;break;default: 语句或程序块;}//第三种:以上两种混合
- 同:
- 都是判断
表达式==常量表达式
- 都是判断
- 不同
- 省略:c语言的switch(表达式)的表达式不可省略
- break:c语言的带break=go语言带或者不带break
- case:c语言后必须是常量表达式
?Type swich
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。(???) Type Switch 语法格式如下:
switch x.(type){case type:statement(s);case type:statement(s);/* 你可以定义任意个数的case */default: /* 可选 */statement(s);}
实例

fallthrough
使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
select语句
涉及到通道channel,会在并发编程那里解决
循环语句
对,你没看错,只有for,注意三个循环控制语句,和for…range
:::info 综述
:::
- 循环控制语句——for循环(包括for循环嵌套+无限循环)
- 循环控制语句

- 无限循环
!逻辑分析
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语言的差别
- 对比上下文即可知,go的for = c语言的for + whlie
- C语言的for是不可以省略
()和;的,但go语言可随时省略(),在无init和post的时候可省略;
for (表达式1; 表达式2; 表达式3){循环体}
:::info go语言实例
:::
- 实例1

- 实例2

无限循环
要停止无限循环,可以在命令窗口按下ctrl-c 。
For-each range 循环
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。后面有一个章节专门讲for…range结构
//基本格式for key, value := range 迭代体名 {循环体}//只要keyfor key := range 迭代体名{循环体}//只要key还可以这样写for key:_= range 迭代体名{循环体}//只要valuefor _, value := range 迭代体名{循环体}
嵌套循环
只要弄清逻辑和格式就行
循环控制语句
break
和c一样,这里只提一件事情,就是标记的break


continue
可以用标号 label 标出想 continue 的循环。一定要对比一下标号label的break和continue
#### goto语句
功能:
Go 语言的 goto 语句可以无条件地转移到过程中指定的行。goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
:::info 语法
:::
两个语句谁前谁后都可以
goto label;//开始跳跃...label: statement;//跳到的位置

实例


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

