我们经常需要代码在满足一定条件时进行执行,或者需要重复执行代码多次,此时需要选择条件语句(if-else if- else)或选择语句(switch case)及循环语句(for)
条件语句
if
当 if 表达式的结果为 true 则执行语句块内代码
has := true
if has {
fmt.Println("买到水果")
}
if-else
当 if 表达式结果为 true,则执行 if 语句块内代码,否则执行 else 语句块内代码
has := false
if has {
fmt.Println("买到水果")
} else {
fmt.Println("没有买到水果")
}
else if
当 if 表达式结果为 true,则执行 if 语句块内代码,否则依次从上到下判断 else if 表达式结果,若结果为 true 则执行对应语句块内代码并退出 if-else if-else 语句,若 if 和else if 表达式均为 false,则执行 else 语句块内代码
var score int = 88
if score >= 90 {
fmt.Println("A")
} else if score >= 80 {
fmt.Println("B")
} else if score >= 60 {
fmt.Println("C")
} else {
fmt.Println("D")
}
初始化子语句
可以在 if 语句中初始化语句块内的局部变量,多个语句之间使用逗号(;)分隔
只能初始化true或false
if flag := true; flag {
fmt.Println("flag:", flag) //flag: true
}
if flag := false; flag {
fmt.Println("flag if:", flag)
} else {
fmt.Println("flag else:", flag) //flag else: false
总结
对于条件语句必须有 if 语句,可以有 0 个或多个 else if 语句,最多 1 个 else 语句,语句从上到下执行,执行第一个条件表达式为 true 的语句块并退出,否则执行 else 语句块退出
选择语句
根据输入条件的不同选择不同的语句块进行执行(多分支)
switch-case单值
swtich 语句后面跟接变量,此时选择与变量相同的 case 语句块执行并退出,若所有 case均不相同则执行 default 语句块,case 语句中可包含多个不同的值进行匹配
input := "y"
switch input {
case "yes","y":
fmt.Println("确认")
case "no","n":
fmt.Println("取消")
default:
fmt.Println("选项错误")
}
switch 后不跟接变量,此时自上到下选择第一个表达式为 true 的 case 语句块执行并退出,若所有 case 表达式均为 false,则执行 default 语句块
input := 80
switch {
case input >= 90:
fmt.Println("A")
case input >= 80:
fmt.Println("B")
default:
fmt.Println("C")
}
初始化子语句
可以在 switch 语句中初始化语句块内的局部变量,多个语句之间使用逗号(;)分隔,注意初始化表达式时后面的逗号(;)不能省略
switch operate := "add"; operate {
case "add":
fmt.Println("添加")
case "delete":
fmt.Println("删除")
case "modify":
fmt.Println("修改")
case "query":
fmt.Println("查询")
default:
fmt.Println("操作错误")
}
switch score := 80; {
case score >= 90:
fmt.Println("A")
case score >= 80:
fmt.Println("B")
case score >= 60:
fmt.Println("C")
default:
fmt.Println("D")
}
fallthrough
switch-case 默认执行 case 语句后退出,若需要继续执行下一个 case 语句块,可以在 case语句块中使用 fullthrough 进行声明
switch score := 80; {
case score >= 90:
fmt.Println("A")
case score >= 80:
fmt.Println("B")
fallthrough
case score >= 60:
fmt.Println("C")
default:
fmt.Println("D")
}
总结
对于选择语句可以有 0 个或多个 case 语句,最多有 1 个 default 语句,选择条件为 true的 case 语句块开始执行并退出,若所有条件为 false,则执行 default 语句块并退出。可以通过 fallthrough 修改执行退出行为,继续执行下一条的 case 或 default 语句块
循环语句
for
for 初始化语句; 条件语句; 后置语句 {}
for 语句后有三个子语句分别为:初始化子语句,条件子语句和后置子语句
执行顺序为:
1、初始化子语句
2、 条件子语句
3、语句块
4、后置子语句
5、b->c->d
6、…
7、直到条件子语句为 false 结束循环
sum := 0
for i := 1; i <= 100; i++{
sum += i
}
fmt.Println(sum)
break与continue语句
break 用于跳出循环,当条件满足则结束循环
continue 用于跳过本次循环,当条件满足这跳过本次循环进行后置或条件子语句执行
// continue
for i := 1; i <= 5; i++{
if i == 3 {
continue
}
fmt.Println(i)
}
// break
for i := 1; i <= 5; i++ {
if i == 3{
break
}
fmt.Println(i)
}
for实现类while
for 子语句可以只保留条件子语句,此时类似于其他语言中的 while 循环
sum := 0
i := 1
for i <= 100 {
sum += i
i++
}
fmt.Println(sum)
无限循环
for 子语句全部省略,则为无限循环(死循环),s 常与 break 结合使用
sum := 0
i := 1
for {
if i > 100 {
break
}
sum += i
i++
}
fmt.Println(sum)
i := 0
for {
i++
fmt.Println(i)
}
// ctrl+z或者ctrl+c终止程序运行
for-range
用于遍历可迭代对象中的每个元素,例如字符串,数组,切片,映射,通道等
针对包含 Unicode 字符的字符串遍历是需要使用 for-range,range 返回两个元素分别为字节索引和 rune 字符,可通过空白标识符忽略需要接收的变量
text := "我爱中国"
for i, e := range text {
fmt.Printf("%d: %c\n", i, e)
}
for _, e := range text{
fmt.Printf("%c\n", e)
}
/*结果
0: 我
3: 爱
6: 中
9: 国
我
爱
中
国
*/
label与goto
for、switch 语句都可以配合标签(label)形式的标识符使用,即某一行第一个以冒号(:)结尾的单词
标签的名称是大小写敏感的,为了提升可读性,一般建议使用全部大写字母
使用标签和 Goto 语句是不被鼓励的:它们会很快导致非常糟糕的程序设计,而且总有更加可读的替代方案来实现相同的需求。
可以通过 goto 语句任意跳转到当前函数指定的 label 位置
sum := 0
i := 1
START: //定义标签
if i > 100 {
goto END //跳至END标签
} else {
sum += i
i++
goto START //跳至START标签
}
END: //定义标签
fmt.Println(sum)
break 和 continue 后也可以指定 label 用于指定跳出或跳过指定 label 同层级的循环
OI:
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
if j == 3 {
continue OI // 跳过外层循环
}
fmt.Println(i, j, "=")
}
}
BI:
for i := 0; i < 5; i++{
for j := 0; j < 5; j++{
if j == 3{
break BI //跳出外层循环
}
fmt.Println(i, j)
}
}