判断语句
:::info 综述
:::
三种:
注意:**Go 没有三目运算符,所以不支持 ?: 形式的条件判断。**
if语句
语法结构如下
//语法结构1
if 布尔表达式 {
...
}
//语法结构2
if 布尔表达式 {
...
} else {
...
}
//语法结构3
if 布尔表达式 {
...
} 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 main
import "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 迭代体名 {
循环体
}
//只要key
for key := range 迭代体名{
循环体
}
//只要key还可以这样写
for key:_= range 迭代体名{
循环体
}
//只要value
for _, value := range 迭代体名{
循环体
}
嵌套循环
只要弄清逻辑和格式就行
循环控制语句
break
和c一样,这里只提一件事情,就是标记的break
continue
可以用标号 label 标出想 continue 的循环。一定要对比一下标号label的break和continue #### goto语句 功能: Go 语言的 goto 语句可以无条件地转移到过程中指定的行。goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。 但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。:::info 语法
:::
两个语句谁前谁后都可以
goto label;//开始跳跃
..
.
label: statement;//跳到的位置
实例
应用
利用函数的多返回值 + if语句