判断语句(3)
:::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: 语句或程序块;}//第三种:以上两种混合
?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,会在并发编程那里解决
循环语句(1→2)
对,你没看错,只有for,注意三个循环控制语句,和for…range
:::info 综述
:::
- 循环控制语句——for循环(包括for循环嵌套+无限循环)
- 循环控制语句

- 无限循环
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
for (表达式1; 表达式2; 表达式3){循环体}
:::info 实例
:::
- 实例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语句

