Go语言入门之流程控制简述
1.if语句
if
语句和其他语言一样,只不过go语言
的if
不需要用括号包裹
if
语句的分支代码块的左大括号与if
关键字在同一行上,这是go
代码风格的统一要求
简单实例:
func main() {
// 猜数字
a := 2
if a > 0 {
if a > 3 {
fmt.Println("数字过大")
} else if a == 1 {
fmt.Println("再大一点")
} else if a == 2 {
fmt.Println("再大一点")
} else if a == 3 {
fmt.Println("猜对了")
}
} else {
fmt.Println("数字过小")
}
}
// 输入的是2,输出的结果是:再大一点
if语句的特殊写法
if 条件判断还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断
// 特殊写法,这种写法将a的作用范围限制在if表达式中
if a := 10; a >5 {
fmt.Println(a)
return
}
2.for语句
go语言只支持for循环,没有while
(1)for语句的7种用法
第一种:普通写法
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
第二种:无限循环
for{
// 无限循环代码块
}
第三种:for后只写条件
n := 0
// for后面只加条件
for n < 3 {
n++
}
fmt.Println(n)
第四种:for range 遍历切片
var slice []int = []int{1, 2, 3, 4, 5}
// for range循环切片或数组
for index, value := range slice {
fmt.Printf("index:%d,value:%d \n", index, value)
}
第五种:for range 遍历字符串和整数
// 可以循环字符串 字符串底层为一个byte切片
// 字符串大小为16字节,其有一个指针和int型长度组成
for _, j := range "zhangsan" {
fmt.Printf("%c \n", j)
}
// for range还可以遍历整数
for i := range 5 {
fmt.Printf("%d", i+1)
}
// 打印结果:12345
第六种:遍历map
// 循环map
mmap := map[int]string{
11: "hh",
22: "ff",
33: "ww",
}
for key, value := range mmap {
fmt.Println(key, value)
}
第七种:for range 遍历channel
// 循环channel
chnl := make(chan int)
go func() {
chnl <- 100
chnl <- 1000
chnl <- 10000
chnl <- 100000
close(chnl)
}()
for i := range chnl {
fmt.Println(i)
}
(2)for语句的4种结束方法
第一种:return
func main() {
step := 2
for step > 0 {
step--
fmt.Println(step)
//执行一次就结束了
return
}
//不会执行
fmt.Println("结束之后的语句....")
}
第二种:break
注意:go语言中break只能跳出一层for循环
func main() {
step := 2
for step > 0 {
step--
fmt.Println(step)
//跳出循环,还会继续执行循环外的语句
break
}
//会执行
fmt.Println("结束之后的语句....")
}
第三种:panic
func main() {
step := 2
for step > 0 {
step--
fmt.Println(step)
//报错了,直接结束
panic("出错了")
}
//不会执行
fmt.Println("结束之后的语句....")
}
第四种:goto
func main() {
for x := 0; x < 10; x++ {
if x == 2 {
// 跳转到标签
goto breakHere
}
}
// 手动返回, 避免执行进入标签
return
// 标签
breakHere:
fmt.Println("done")
}
3.switch语句
Go语言的switch同其他语言的差不多,使用 switch 语句可方便地对大量的值进行条件判断。
switch 分支表达式可以是任意类型,不限于常量。可省略 break,默认自动终止。
switch后如果没有表达式会对第一个true进行匹配
例子如下:
// 成绩判定
grade := "B"
// 输入90
var score int = 90
switch score {
case 90:
grade = "A"
case 80:
grade = "B"
case 50, 60, 70:
grade = "C"
// 无论 default出现在什么位置,它只会在所有case都没有匹配上的情况下才会被执行
default:
grade = "D"
}
fmt.Println(grade)
//结果是:A
注意:
Go里面switch默认相当于每个case最后带有break
匹配成功后不会自动向下执行其他case,而是跳出整个switch
如果需要执行完一个case之后,进入下一个case不跳出
swtich
这就需要用到
fallthrough
,无论如何都会进入下个casea := "hello" switch { case a == "hello": fmt.Print("hello ") fallthrough case a == "world": fmt.Println("world") } //打印结果:hello world
4.goto语句
goto 语句通过
标签
进行代码间的无条件跳转goto 语句可以实现快速跳出循环、避免重复退出
因此 goto 语句能简化一些代码的实现过程
func main() {
if 20 > 10 {
goto GotoTag1
}
return
GotoTag1:
fmt.Println("tag1")
if 10 > 5 {
goto GotoTag2
}
return
GotoTag2:
fmt.Println("tag2")
}
5.break语句
break 语句可以结束 for、switch 和 select 的代码块
break 语句还可以在语句后面添加
标签
,表示退出某个标签对应的代码块
标签
要求必须定义在对应的for
、switch
和select
的代码块上。
func main() {
OuterLoop:
for i := 0; i < 2; i++ {
for j := 0; j < 5; j++ {
switch j {
case 2:
fmt.Println(i, j)
break OuterLoop
case 3:
fmt.Println(i, j)
break OuterLoop
}
}
}
}
6.continue语句
continue 语句可以结束当前循环,开始下一次的循环迭代过程
仅限在 for 循环内使用
在 continue 语句后添加
标签
时,表示开始标签对应的循环
func main() {
OuterLoop:
for i := 0; i < 2; i++ {
for j := 0; j < 5; j++ {
switch j {
case 2:
fmt.Println(i, j)
continue OuterLoop
}
}
}
}