第六课 go语言基础-流程控制语句
tags:
- golang
- 2019尚硅谷
categories:
- golang
- 流程控制语句
- if
- switch
- for
文章目录
第一节 go语言流程控制介绍
在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。
golang 中没有while和do…while的语法。可以用if和for模拟。
- 顺序控制 (没有循环和跳转,比较简单)
- 分支控制
- 循环控制
第二节 go语言 if 分支控制
让程序有选择的的执行分支控制有三种:
- 单分支
- 双分支
- 多分支
1. 单分支if语句
基本语法: 不需要()
if 条件表达式 {
执行代码块
}
**注意:**当条件表达式为true时,就会执行{}的代码。注意{}是必须有的,就算你只写一行代码。
package main
import "fmt"
func main() {
//编写一个程序,可以输入人的年球,如果该同志的年龄大于18岁,则输出”你年龄大
//于18,要对自己的行为负责!”
var age int
fmt.Println("输入您的年龄")
fmt.Scanln(&age)
// 这里不需要()
if age > 18 {
fmt.Println("你年龄大于18,要对自己的行为负责!")
}
}
golang 支持在if中直接定义变量 如下:
package main
import "fmt"
func main() {
// golang 支持在if中直接定义变量 如下:
if age := 20; age > 18 {
fmt.Println("你年龄大于18,要对自己的行为负责!")
}
}
2. 双分支if 语句
基本语法
if条件表达式{
执行代码块1
}else {
执行代码块2
}
注意:当条件表达式成立,即执行代码块1,否则执行代码块2。{} 也是必须有的。
3. 多分支if 语句
基本语法
if 条件表达式1 {
执行代码块1
}else if条件表达式2 {
执行代码块2
}
....
else {
执行代码块n
}
注意: 最后的else,可以有也可以没有。只会执行一个if分支。
package main
import "fmt"
func main() {
// 使用陷阱 这里只会进到一个if中
var age int
fmt.Println("输入您的年龄")
fmt.Scanln(&age)
if age > 18 {
fmt.Println("ok1")
} else if age > 9 {
fmt.Println("ok2")
} else if age > 4 {
fmt.Println("ok3")
}
}
4. 嵌套分支if 语句
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。(不宜过多,最多不要超三层)
基本语法
if 条件表达式 {
if 条件表达式 {
执行代码块
} else {
执行代码块
}
}
第三节 go语言 switch 分支结构
- switch语句用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上到下逐一测试, 直到匹配为止。
- 匹配项后面也不需要再加break(golang默认给加了break, 不用自己写了)
基本语法
switch表达式{
case表达式1,表达式2, ... :
语句块1
case表达式3,表达式4, ... :
语句块2
//这里可以有多个case语句
default:
语句块
}
- 注意事项
- case后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
- case后 的各个表达式的值的数据类型,必须和switch 的表达式数据类型一致
- case后 面可以带多个表达式,使用逗号间隔。比如case表达式1,表达式2…
- case后 面的表达式如果是常量值(字面量),则要求不能重复
- case后 面不需要带break ,程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都匹配不到,则执行default
- default 语句不是必须的
- switch 后也可以不带表达式,类似lif-else分支来使用。
- switch 后也可以直接声明定义一个变量,分号结束,不推荐
- switch 穿透fallthrough,如果在case语句块后增加allthrough ,则会继续执行下一个case,也叫switch穿透
- Type Switch: switch 语句还可以被用于type-switch来判断某个interface
(接口)变量中实际指向的变量类型
package main
import "fmt"
func main() {
var age int = 20
// switch 不加表达式 当作if-else使用
switch {
case age == 10:
fmt.Println("age的值为10")
case age >= 20:
fmt.Println("age的值为20以上")
default:
fmt.Println("默认")
}
// switch 后也可以直接声明定义一个变量,分号结束,不推荐
switch score := 80; {
case score < 60:
fmt.Println("不合格")
case score > 60 && score <=80:
fmt.Println("合格")
default:
fmt.Println("优秀")
}
// fallthrough switch穿透
var num int = 20
switch num{
case 20:
fmt.Println("num的值为20")
fallthrough //默认只能穿透一层 输出为num的值为20 num的值为30
case 30:
fmt.Println("num的值为30")
default:
fmt.Println("默认")
}
//switch 语句还可以被用于type-switch来判断某个interface(接口)变量中实际指向的变量类型
var x interface{}
var y = 10.0
x = y
switch i := x.(type) {
case nil:
fmt.Printf(" x的类型~ :%T" ,i)
case int:
fmt. Printf("x是int型")
case float64:
fmt. Printf("x是float64型" )
case func(int) float64:
fmt.Printf("x是func(int) 型")
case bool, string:
fmt.Printf("x是bool或string 型")
default:
fmt.Printf("未知型")
}
}
第四节 go语言for循环
听其名而知其意,就是让代码可以循环的执行。
基本语法如下:
for 循环变量初始化; 循环条件; 循环变量迭代{
循环操作(语句)
}
使用细节和注意事项:
- 循环条件是返回一个布尔值的表达式
- for循环的第二种使用方式 :将变量初始化和变量迭代写到其它位置
for 循环判断条件{
//循环执行语句
}
- for循环的第三种使用方式:上面的写法等价for;;{} 是一个无限循环,通常需要配合break语句使用。
for {
//循环执行语句
}
- Golang提供for-range的方式,可以方便遍历字符串和数组。
- 如果我们的字符串含有中文,那么传统的遍历字符串方式,就是错误,会出现乱码。*for-range方式不会出错。比较智能以字符方式遍历。注意观察index,遇到中文加 3.
- 原因是传统的对字符串的遍历是按照字节来遍历而一个汉字在utf-8编码是对应3个字节。
- 传统方式可以用切片解决。str2 := []rune(str) //就是把str转成[]rune
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++{
fmt.Println("for 循环的基础用法", i)
}
// for循环第二种使用方式
j := 1 // 循环变量的初始化
for j < 10 { // 循环条件
fmt.Println("for 循环的第二种使用方法", j)
j++ //循环变量迭代
}
// for 循环第三种使用方法
k := 1
for{
fmt.Println("for 循环的第三种使用方法")
k++
if k > 3 {
break
}
}
// for-range 方便遍历字符串或者数组
var str string = "hello for 使用"
// 传统方式 需要用切片解决中文问题
str2 := []rune(str) //就是把str转成[]rune
for i := 0; i < len(str2); i++ {
fmt.Printf("%c", str2[i])
}
// for-range方式遍历 比较智能。注意观察index。以字符方式遍历
for index, val := range str{
//如果我们的字符串含有中文,
//那么传统的遍历字符串方式,就是错误,会出现乱码。
//原因是传统的对字符串的遍历是按照字节来遍历。
//for-range方式不会出错
fmt.Printf("index=%d,value=%c \n", index, val)
}
}
第五节 流程跳转语句
1. break
break语句用于终止某个语句块的执行,用于中断当前for循环或跳出switch 语句。
break的引出:
随机生成1-100的一个数,直到生成了99这个数,看看你一共用了几次?
分析:编写一个无限循环的控制,然后不停的随机生成数,当生成了99时,就退出这个无限循环。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// 为了生成一个随机数,还需要给rand设置一个种子(否则是一个伪随机数一直是82)
//time .Now().Unix() :返回一个从1970:01:01的0时0分0秒到现在的秒数
rand.Seed(time.Now().Unix())
fmt.Println(time.Now().Unix())
//随机生成一个1-100的数rand.Intn(100)[0, 100)
n := rand.Intn(100) + 1
fmt.Println(n)
// 计数i
var i int = 0
for {
rand.Seed(time.Now().Unix())
k := rand.Intn(100) + 1
i++
if k == 99{
fmt.Println(i)
break
}
}
}
注意事项和细节说明:
- break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
- 默认只会跳出最近的for循环
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// 指定标签形式 跳转到指定break
label1:
for i := 0; i < 4; i++ {
//label2:
for j := 0; j < 10; j++ {
if j == 2{
//break // 默认只会跳出最近的for循环
break label1
}
fmt.Println("j的值是:", j)
}
}
}
2. continue
- continue语句用于结束本次循环,继续执行下一-次循环。
- continue语 句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和前面的break标签的使用的规则一样.
3. goto
- Go语言的goto语句可以无条件地转移到程序中指定的行。
- goto语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。
- 在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难
- 基本语法:
goto label
...
label: statement
package main
import (
"fmt"
)
func main() {
// 演示goto的使用
fmt.Println("ok1")
goto label
fmt.Println("ok2")
fmt.Println("ok3")
fmt.Println("ok4")
label:
fmt.Println("0k5")
fmt.Println("ok6")
fmt.Println("ok7")
}
4. return
return使用在方法或者函数中,表示跳出所在的方法或函数。下面代码就不执行了。
- 如果retumn是在普通的函数,则表示跳出该函数,即不再执行函数中retum后面代码,也可以理解成终止函数。
- 如果retum是在main函数,表示终止main函数,也就是说终止程序。