Go语言系列:掌握流程控制,让程序顺畅如同滑雪道!
前言
这次接着之前Go
语言的学习,继续来学习Go
语言的基础知识。上一篇Go语言系列:两三天也学不完Go语言的进阶语法知识文章需要两三天时间,那这次预计只需一天时间就能学会Go
语言的流程控制语法,不出意外这次也要耐心看完哦。
Go语言的流程控制
上次聊到Go
语言进阶语法知识,这次书接上回,接着往下聊,慢慢地往后深入→
一、if else
在Go
语言,if else
条件判断格式如下:
if 表达式1 {
分支1
} else if 表达式2 {
分支2
} else {
分支3
}
- 当表达式1的结果为 true 时,会执行分支1的代码;
- 当表达式1的结果为 false 时,会执行表达式2,若结果为 true, 则会执行分支2的代码。
- 当前面的条件都不满足,即都为 false 时,会执行分支3的代码。
注意:Go 语言中规定:if 的 左括号 ‘’{‘’ 必须与 if 表达式放在同一行,如果强行放置在其他位置,会发生如下编译错误。
1.1 if else示例
package main
import "fmt"
func main() {
a := 1
if a == 1 {
fmt.Println("a等于1")
} else {
fmt.Println("a不等于1")
}
}
代码输出如下:
1.2 if的特殊写法
在if
表达式之前添加一个执行语句,再根据变量进行判断,代码如下:
package main
import "fmt"
func main() {
if a := 1; a == 2 {
fmt.Println("a等于1")
} else {
fmt.Println("a不等于1")
}
}
代码输出如下:
二、for循环
在Go
语言中,循环需要使用关键字for
来完成,格式如下:
for 初始语句;条件表达式;结束语句 {
循环体代码
}
for
循环会不停地进行循环,直到条件表达式返回false
才推出循环,即执行for
循环}
后面的代码。
2.1 初始语句
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
fmt.Println("执行循环了")
}
}
代码输出如下:
另外,初始语句可以不写,但是初始语句后的分号必须写,如下:
package main
import "fmt"
i := 0
func main() {
for ; i < 10; i++ {
fmt.Println("执行循环了")
}
}
需注意,如果初始语句放在for
循环语句之前声明,则变量的作用域不止在for
循环内,for
循环外也可以访问到初始的变量。
下面这种写法也可以正常循环,如下:
package main
import "fmt"
i := 0
func main() {
for i < 10 {
i++
fmt.Println("执行循环了")
}
}
此种写法的输出结果也和上面两种写法的结果一致的。
2.2 死循环
条件语句也可以不写,不写就代表着没有终止条件,则会陷入死循环。如下:
package main
import "fmt"
i := 0
func main() {
for ; ; i++ {
fmt.Println("执行循环了")
}
}
执行上述代码就会在控制台一直打印"执行循环了",需要使用Ctrl + c
终止。
下面的代码写可以造成死循环,如下:
package main
import "fmt"
func main() {
for {
fmt.Println("执行循环了")
}
}
三、for range循环
在Go
语言中,还可以通过for range
来遍历数组 、切片 、字符串、map等。
3.1 遍历数组、切片和字符串
通过for range
便利数组、切片、字符串的返回值index
表示下标索引,value代表下表对应的值。
package main
import "fmt"
func main() {
s := []int{100, 200, 300} // 切片
for index, value := range s {
fmt.Println(index, value)
}
}
代码输出结果:
下面来演示遍历字符串,如下:
package main
import "fmt"
func main() {
str := "hello world"
for index, value := range str {
fmt.Printf("%d %c\n", index, value)
}
}
代码输出结果:
3.2 遍历map字典
通过for range
遍历map字典
会返回键和值,称为键值对,它们总是一对一出现。代码如下:
package main
import "fmt"
func main() {
m := map[int]string{
1: "aaa",
2: "bbb",
}
for key, value := range m {
fmt.Printf("%d %s\n", key, value)
}
}
代码输出结果:
注意:对map字典
进行遍历时,遍历出的键值对是无序的,如果需要有序输出,需要先排序。
3.3 使用匿名变量
如果在for range
遍历中只想获取下标或值,可以使用匿名变量。所谓的匿名变量可以理解为是一个占位符,不会占据内存,也不会占用变量名。如下:
package main
import "fmt"
func main() {
s := []int{100, 200, 300}
for _, value := range s {
fmt.Println(value)
}
}
代码输出结果:
四、switch
在Go
语言中,可使用switch
语句可以非常方便地对大量值进行条件判断。
4.1 基础语法
Go
语言中switch
中的每一个case
都是独立代码块,无需通过break
语句跳出代码块,以避免执行到下一个case
代码块。
switch var { // 从上往下匹配,匹配上就执行对应的代码,执行完不会执行下一个case,且不需要break
case v1:
// do something
case v2:
// do something
case v3:, v4: // 匹配多个值,有一个满足条件即可
// do something
default:
// do something
}
下面就来看一下示例代码,如下:
package main
import "fmt"
func main() {
day := 3
switch day {
case 1:
fmt.Println("今天是周一")
case 2:
fmt.Println("今天是周二")
case 3:
fmt.Println("今天是周三")
case 4:
fmt.Println("今天是周四")
case 5:
fmt.Println("今天是周五")
case 6, 7:
fmt.Println("今天是周末")
default:
fmt.Println("日期不正确")
}
}
代码输出结果:
还可以在swtich
里面初始化变量,如下:
package main
import "fmt"
func main() {
switch day := 3; day {
case 1:
fmt.Println("今天是周一")
case 2:
fmt.Println("今天是周二")
case 3:
fmt.Println("今天是周三")
case 4:
fmt.Println("今天是周四")
case 5:
fmt.Println("今天是周五")
case 6, 7:
fmt.Println("今天是周末")
default:
fmt.Println("日期不正确")
}
}
4.2 其他用法
case
后面除了定义常量以外,还可以像if
语句一样添加表达式,代码如下:
package main
import "fmt"
func main() {
switch score := 90; {
case score > 90:
fmt.Println("优秀")
case score > 80:
fmt.Println("中等")
case score > 70:
fmt.Println("良好")
case score > 60:
fmt.Println("及格")
default:
fmt.Println("继续努力")
}
}
代码输出结果:
4.3 fallthrough
fallthrough
就是强制执行下一个case,不会判断满不满足条件。如下:
package main
import "fmt"
func main() {
switch score := 90; {
case score > 90:
fmt.Println("优秀")
case score > 80:
fmt.Println("中等")
fallthrough
case score > 70:
fmt.Println("良好")
case score > 60:
fmt.Println("及格")
default:
fmt.Println("继续努力")
}
}
代码输出结果:
五、goto跳转
在Go
语言中,goto
语句通过标签实现代码间的跳转。它通常会被使用在快速跳出循环、避免定义重复代码等。
package main
import "fmt"
func main() {
fmt.Println("aaa")
goto TIGER
fmt.Println("bbb")
fmt.Println("ccc")
TIGER:
fmt.Println("ddd")
}
代码输出结果:
需要注意:goto和标签之间不能有心变老的声明,否则会报错。
package main
import "fmt"
func main() {
fmt.Println("aaa")
goto TIGER
num := 100 // 报错
fmt.Println("bbb")
fmt.Println("ccc")
TIGER:
fmt.Println("ddd")
}
六、break语句
在Go
语言中,break
语句用来终止循环。如下:
6.1 跳出单层循环
package main
import "fmt"
func main() {
i:= 0
for ; i < 10; i++ {
if i==4 {
break
}
fmt.Println(i)
}
}
代码输出结果:
6.2 跳出多层循环
package main
import "fmt"
func main() {
for i:= 0; i < 4; i++ {
for j := 0; j < 4; j++ {
if j==2 {
break
}
fmt.Println(i, j)
}
}
}
代码输出结果:
终止整个循环
通过break
语句搭配标签可以跳出代码块。如下:
package main
import "fmt"
func main() {
STOP:
for i:= 0; i < 4; i++ {
for j := 0; j < 4; j++ {
if j==2 {
break STOP // 终止整个循环
}
fmt.Println(i, j)
}
}
}
代码输出结果:
七、continue语句
在Go
语言中,continue
语句是跳过当次循环,进入下一次循环。如下:
package main
import "fmt"
func main() {
i:= 0
for ; i < 10; i++ {
if i==4 {
continue
}
fmt.Println(i)
}
}
代码输出结果:
continue
语句也可以搭配标签一起使用,和break是类似的。如下:
package main
import "fmt"
func main() {
LABEL:
for i:= 0; i < 4; i++ {
for j := 0; j < 4; j++ {
if j==2 {
break LABEL // 类似于此处不使用标签的break
}
fmt.Println(i, j)
}
}
}
代码输出好结果:
最后,掌握流程控制语句是成为一名优秀的Go程序员的基本要求。通过掌握这些语句,可以让程序的运行更加顺畅,从而提高程序的效率和性能。赶紧一起学起来吧,一起去卷go语言开发的饭碗^_^
往期精彩文章
后语
小伙伴们,如果觉得本文对你有些许帮助,点个👍或者➕个关注再走呗^_^ 。另外如果本文章有问题或有不理解的部分,欢迎大家在评论区评论指出,我们一起讨论共勉。
转载自:https://juejin.cn/post/7213022785366835255