Golang语言学习笔记(五)
Golang中的流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”
Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制
1.if else(分支结构)
if 表达式1 {
分支1
}else if 表达式2 {
分支2
}else {
分支3
}
2.for循环语句
for 初始语句;条件表达式;结束语句{
循环体语句
}
3.for range循环
for 键,值 := range 被循环的变量 {
循环体语句
}
4.switch case语句
使用switch语句可方便的对大量的值进行条件判断
switch 表达式 {
case condition :
分支1
break
default :
分支2
}
switch的穿透语句 fallthrough
fallthrough语法可以执行满足条件的case的下一个case,是为了兼容C语言中的case设计的
5.break
Go语言中break用于以下几个方面:
*用于循环语句中跳出循环,并开始执行循环之后的语句
*break在switch(开关语句)中在执行一条case后跳出语句的作用
*在多重循环中,可以用标号label标出想break的循环
6.continue
continue语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用
7.goto
goto语句通过标签进行代码间的无条件跳转,goto语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go语言中使用goto语句能简化一些代码的实现过程
代码:
demo10/main.go
package main
import (
"fmt"
)
func main() {
/*
Go语言中if条件判断的格式如下:
if 表达式1 {
分支1
}else if 表达式2 {
分支2
}else {
分支3
}
*/
//1.最简单的if语句
// flag := true
// if flag {
// fmt.Println("flag=true")//flag=true
// }
// age := 30
// if age > 18 {
// fmt.Println("成年人")
// }
//2.if语句的另一种写法
// if age := 30; age > 20 {
// fmt.Println("成年人")
// }
//第二种写法的age只是一个局部变量,if条件外部不可再使用age变量
//3.输入一个人的成绩,如果成绩大于90输出A,如果小于90小于75输出B,否则输出C
// var score = 76;
// if score >= 90 {
// fmt.Println("A")
// } else if score >= 75 {
// fmt.Println("B")
// } else {
// fmt.Println("C")
// }
/*
注意:
1.if 条件表达式()可以省略不写,但是{}不能省略
2.{必须紧挨着条件表达式,不可换行
*/
//4.求两个数的最大值
// var a = 34
// var b = 11
// var max int
// if a > b {
// max = a
// } else {
// max = b
// }
// fmt.Println("a,b之间的最大值是:",max)//a,b之间的最大值是: 34
//5.for循环语句
/*
for 初始语句;条件表达式;结束语句{
循环体语句
}
*/
//1.打印1-10的所有数据
/*
for循环的执行流程:
1.i :=1
2.i <= 10
3.执行花括号里面的语句
4.i++ ------i=2
5.i<=10
6.执行花括号里面的语句
7.i++ ------i=3
8.i <= 10
.....
n.i++ ------i=10
n+1.i<=10
n+2.执行花括号里面的语句
n+3.i++ ------i=11
n+4.i<=10 ------不满足条件,循环结束
*/
// for i := 1; i <= 10; i++ {
// fmt.Println(i)
// }
//for循环的另一种写法, for循环的初始语句可以被忽略,但是初始语句后的分号必须要写
// i := 1
// for ; i <= 10; i++ {
// fmt.Println(i)
// }
//for循环的第三种写法, 写for循环的时候要注意死循环,for循环的初始语句和结束语句都可以省略
// i := 1
// for ; i <= 10; {
// fmt.Println(i)
// i++
// }
/*
无限循环
for {
循环体语句
}
注意:Go语言中没有while语句,可以通过for代替
*/
// i := 1
// for {
// if i <= 10 {
// fmt.Println(i)
// } else {
// break //跳出循环
// }
// i++
// }
//----------------练习------------
//1.打印0-50的所有偶数
// for i :=0; i <= 50; i++ {
// if i%2 ==0 {
// fmt.Println(i)
// }
// }
//2.求1+2+3+4+...100的和
// sum := 0
// for i := 1; i <= 100; i++ {
// sum += i
// }
// fmt.Println(sum)//5050
//3.打印1~100之间所有是9的倍数的整数的个数及总和
// sum := 0
// count := 0
// for i := 1; i <= 100; i++ {
// if i%9 == 0 {
// count ++
// sum += i
// }
// }
// fmt.Printf("count is %v, sum = %v",count,sum)//count is 11, sum = 594
//4.计算5的阶乘(5*4*3*2*1)
// sum := 1
// for i := 1; i <= 5; i++ {
// sum *= i
// }
// fmt.Println(sum)
//5.打印一个矩形,for循环的嵌套
/*
**********
**********
**********
*/
//一个for循环实现
// for i := 1; i <= 30; i++ {
// fmt.Print("*")
// if i%10 == 0 {
// fmt.Println()
// }
// }
//嵌套循环,扩展性更强
// for i := 0; i < 3; i++ {
// for j := 0; j < 10; j++ {
// fmt.Print("*")
// }
// fmt.Println()
// }
//6.打印一个三角形
// row := 5
// for i := 0; i < row; i++ {
// for j :=0; j <= i; j++ {
// fmt.Print("*")
// }
// fmt.Println()
// }
//7.打印九九乘法表
// for i := 1; i <= 9; i++ {
// for j :=1; j <= i; j++ {
// fmt.Printf("%vx%v=%v\t",j,i,i*j)
// }
// fmt.Println()
// }
//for range
// var str = "你好Golang"
// for k,v := range str {
// fmt.Printf("key=%v value=%c\n",k,v)
// }
/*
输出为:
key=0 value=你
key=3 value=好
key=6 value=G
key=7 value=o
key=8 value=l
key=9 value=a
key=10 value=n
key=11 value=g
*/
// var arr =[]string{"php","java","js","golang"}
// for i := 0; i < len(arr); i++ {
// fmt.Println(arr[i])
// }
// for _,val := range arr {
// fmt.Println(val)
// }
//switch case
/*
switch 表达式 {
case condition :
分支1
break
default :
分支2
}
*/
//判断文件类型,如果后缀名是.html,输出text/html,如果后缀名是.css,输出text/css,如果后缀名是.js,输出text/javascript.
// var ext = ".html"
// if ext == ".html" {
// fmt.Println("text/html")
// } else if ext == ".css" {
// fmt.Println("text/css")
// } else if ext == ".js" {
// fmt.Println("text/javascript")
// } else {
// fmt.Println("找不到匹配的后缀名")
// }
//switch case的基本使用
// var extname = ".html"
// switch extname {
// case ".html":
// fmt.Println("text/html")
// break
// case ".css":
// fmt.Println("text/css")
// break
// case ".js":
// fmt.Println("text/javascript")
// break
// default :
// fmt.Println("找不到匹配的后缀名")
// }
//也可以将初始语句放在switch之后,这样变量就是一个局部变量,只在switch语句中有效
// switch extname := ".html"; extname {
// case ".html":
// fmt.Println("text/html")
// break
// case ".css":
// fmt.Println("text/css")
// break
// case ".js":
// fmt.Println("text/javascript")
// break
// default :
// fmt.Println("找不到匹配的后缀名")
// }
//一个分支可以有多个值,多个case值中间使用英文逗号分隔
//判断一个数是奇数还是偶数
// var n = 5
// switch n {
// case 1, 3, 5, 7, 9:
// fmt.Println("奇数")
// break //golang中break可以写也可以不写,不写不会穿透
// case 2, 4, 6, 8, 10:
// fmt.Println("偶数")
// }
//ABC为及格,D为不及格
// var score = "A"
// switch score{
// case "A","B","C" :
// fmt.Println("及格")
// case "D" :
// fmt.Println("不及格")
// }
//分支还可以写表达式,这时候 switch语句后面不需要再跟判断变量
// var age = 30
// switch {
// case age < 24 :
// fmt.Println("好好学习")
// case age >= 24 && age <= 60 :
// fmt.Println("好好赚钱")
// case age > 60 :
// fmt.Println("注意身体")
// default :
// fmt.Println("输入错误")
// }
//switch的穿透 fallthrough, 只能穿透到相邻一层,多个fallthrough可以持续向下穿透
// var age = 30
// switch {
// case age < 24 :
// fmt.Println("好好学习")
// case age >= 24 && age <= 60 :
// fmt.Println("好好赚钱")
// fallthrough
// case age > 60 :
// fmt.Println("注意身体")
// default :
// fmt.Println("输入错误")
// }
//break(跳出循环)
/*
Go语言中break用于以下几个方面:
*用于循环语句中跳出循环,并开始执行循环之后的语句
*break在switch(开关语句)中在执行一条case后跳出语句的作用
*在多重循环中,可以用标号label标出想break的循环
*/
// for i := 1; i <= 10; i++ {
// if i == 2 {
// break//表示当i=2的时候跳出当前循环
// }
// fmt.Println(i)
// }
// fmt.Println("继续执行")
// for i := 0; i <= 2; i++ {
// for j := 0; j < 10; j++ {
// if j == 3 {
// break
// }
// fmt.Printf("i=%v j=%v\n",i,j)
// }
// }
/*
输出结果为:
i=0 j=0
i=0 j=1
i=0 j=2
i=1 j=0
i=1 j=1
i=1 j=2
i=2 j=0
i=2 j=1
i=2 j=2
*/
//break在switch中在执行一条case后跳出语句的作用
// var extname = ".css"
// switch extname {
// case ".html":
// fmt.Println("text/html")
// break
// case ".css":
// fmt.Println("text/css")
// break
// case ".js":
// fmt.Println("text/javascript")
// break
// default :
// fmt.Println("找不到匹配的后缀名")
// }
//在多重循环中,可以用标号label标出想break的循环
// label1:
// for i := 0; i <= 2; i++ {
// for j := 0; j < 10; j++ {
// if j == 3 {
// break label1
// }
// fmt.Printf("i=%v j=%v\n",i,j)
// }
// }
/*
输出结果为:
i=0 j=0
i=0 j=1
i=0 j=2
*/
//continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用
// for i := 1; i <= 10; i++ {
// if i == 3 {
// continue
// }
// fmt.Println(i)
// }
//在continue语句后添加标签时,表示开始标签对应的循环
// for i := 1; i <= 10; i++ {
// for j := 1; j <= 10; j++ {
// if j == 3 {
// continue
// }
// fmt.Printf("i=%v j=%v\n",i,j)
// }
// }
// label2:
// for i := 1; i <= 2; i++ {
// for j := 1; j <= 10; j++ {
// if j == 3 {
// continue label2
// }
// fmt.Printf("i=%v j=%v\n",i,j)
// }
// }
/*
输出结果为:
i=1 j=1
i=1 j=2
i=2 j=1
i=2 j=2
*/
//goto(跳转到指定标签)
var n = 30
if n > 18 {
fmt.Println("成年人")
goto label3
}
fmt.Println("aaa")
fmt.Println("bbb")
label3:
fmt.Println("ccc")
fmt.Println("ddd")
/*
输出结果为:
成年人
ccc
ddd
*/
}