五、流程控制
顺序控制
分支控制
循环控制
顺序控制#
从上到下逐步执行
分支控制#
分支控制就是让程曦有选择执行
单分支
双分支
多分支
单分支控制#
//if 条件表达式 {
//}
func main() {
var age int
fmt.Println("请输入年龄")
fmt.Scanln(&age)
if age>18{
fmt.Println("成年人")
}
}
双分支控制#
if 条件表达式 {
执行代码块1
}else{
执行代码块2
}
案例:
求
提示 1:
提示 2:
math.Sqrt (num);可以求平方根,需要引入 math 包
测试数据:3,100,6
switch 分支控制#
go 中没有 bireak
go 中的 case 可以有多个,用逗号间隔
case\switch 后是一个表达式(常量,变量、有返回值的函数)
case 后表达式的值类型必须和 switch 表达式值的类型一致
default 不是必须
switch 后也可以不带表达式,类型 if-else
switch 穿透 fallthrough,也叫 switch 穿透,在 case 后增加 fallthrough,会继续执行下一个 case(默认只能穿透一层)
switch 判断变量的类型
var key byte
fmt.Scanf("%c",&key)
switch key {
case 'a':fmt.Println("1")
case 'b':fmt.Println("2")
case 'c':fmt.Println("3")
default:
fmt.Println("0")
}
switch test(key)+1
case 1,2,3,4
不带表达式
//不带表达式
var age int = 10
switch {
case age==90: fmt.Println(1)
case age==80: fmt.Println(2)
default:
fmt.Println(0)
}
//case对范围镜像判断
Case age>10 && age<20: fmt.Println(0)
//switch后带一个声明的变量,分号结束
switch age := 10;{
...
}
switch 穿透
var num int =10
switch num {
case 10: fmt.Println(1)
fallthrough
case 20: fmt.Println(2)
case 30: fmt.Println(3)
}
//10
//20
判断变量类型
var x interface{}
var y = 10.0
x = y
switch i := x.(type) {
case nil:
fmt.Printf("%T", i)
case int:
fmt.Printf("int")
case float64:
fmt.Printf("float64")
case func(int) float64:
fmt.Printf("func(int)")
case bool, string:
fmt.Printf("bool或者string")
}
//float64
小写转大写
var s byte
fmt.Println("请输入")
fmt.Scanf("%c", &s)
switch s {
case 'a':
fmt.Println("A")
case 'b':
fmt.Println("B")
case 'c':
fmt.Println("C")
case 'd':
fmt.Println("D")
default:
fmt.Println("other")
}
例子
//判断是否及格
var score float64
fmt.Println("请输入")
fmt.Scanln(&score)
switch int(score / 60) {
case 1:
fmt.Println("及格")
case 0:
fmt.Println("不及格")
default:
fmt.Println("老实点")
}
For#
语法格式
//for-demo1
for i := 0; i < 10; i++ {
fmt.Println("测试")
}
循环变量初始化、循环条件、循环变量迭代
第二种写法
k := 1
for k <= 10 {
fmt.Println("测试")
k++
}
第三种写法
k := 1
for {
if k <= 10 {
fmt.Println("测试")
} else {
break
}
k++
}
字符串遍历 range#
//传统方式
var str string = "hello golang"
for i := 0; i < len(str); i++ {
fmt.Printf("%c\n", str[i])
}
//range
var str string = "hello golang"
for k, v := range str {
fmt.Printf("k=%d,v=%c\n", k, v)
}
但是,汉字遍历会出错,遍历是按字节来遍历,一个汉字在 utf8 中有 3 个字节
解决方案:str 转 [] rune 切片,range 可以直接遍历
var str string = "i am in 深圳"
str1 := []rune(str)
for i := 0; i < len(str1); i++ {
fmt.Printf("%c\n", str1[i])
}
for k, v := range str {
fmt.Printf("k=%d,v=%c\n", k, v)
}
例子
var max uint64 = 100
var count uint64 = 0
var sum uint64 = 0
var i uint64 = 1
for ; i <= max; i++ {
if i/9 == 0 {
count++
sum += i
}
}
fmt.Printf("count=%v sum=%v\n", count, sum)
while 与 do while 的实现#
多重循环#
内存循环完才会进入外层循环
循环次数:内循环 + 外循环
例子:打印乘法表
var num int = 9
for i := 1; i <= num; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%v * %v = %v\t", j, i, j*i)
}
fmt.Println()
}
Break#
中止当前 for 循环或者 switch 语句
var count int = 0
for {
rand.Seed(time.Now().UnixNano())
n := rand.Intn(100) + 1
fmt.Println(n)
count++
if n == 99 {
break
}
}
fmt.Println(count)
- break 默认会跳出最近的一个循环,进入上一层循环
- 在多层嵌套循环中,通过标签指明要终止的是哪一层语句
label1:
for i := 0; i < 3; i++ {
for j := 0; j < 12; j++ {
if j == 2 {
//break
break label1
}
fmt.Println(j)
}
}
}
continue#
结束本次循环,进入下一次循环
可以通过标签指明要跳过的是哪一层循环
label1:
for i := 0; i < 3; i++ {
for j := 0; j < 5; j++ {
if j == 2 {
continue label1
}
fmt.Println(j)
}
}
// 01 01 01
for i := 0; i < 3; i++ {
for j := 0; j < 5; j++ {
if j == 2 {
continue
}
fmt.Println(j)
}
}
// 0,1,3,4, 0,1,3,4, 0,1,3,4
跳转控制语句 goto#
goto 语句可以无条件的转移到程序中指定的行
goto 语句通常与条件语句配合使用,可用来实现条件转移,跳出循环体等功能
不主张用 goto,以免导致程序流程混乱
var n int = 20
fmt.Println(1)
fmt.Println(2)
if n > 11 {
goto lable1
}
fmt.Println(3)
lable1:
fmt.Println(4)
fmt.Println(5)
跳出控制语句 return#
在方法或者函数中,表示跳出所在的方法或者函数
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: