一、程序的流程结构
@author:韩茹
版权所有:北京千锋互联科技有限公司
程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。
顺序结构:从上向下,逐行执行。
选择结构:条件满足,某些代码才会执行。0-1次
分支语句:if,switch,select
循环结构:条件满足,某些代码会被反复的执行多次。0-N次
循环语句:for
二、条件语句 2.1 if 语句 语法格式:
1 2 3 4 5 if 布尔表达式 { } else { }
1 2 3 4 5 6 7 if 布尔表达式1 { } else if 布尔表达式2 { } else { }
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package mainimport "fmt" func main () { var a int = 10 if a < 20 { fmt.Printf("a 小于 20\n" ) } fmt.Printf("a 的值为 : %d\n" , a) }
2.2 if 变体 如果其中包含一个可选的语句组件(在评估条件之前执行),则还有一个变体。它的语法是
1 2 3 4 5 6 7 if statement; condition { } if condition{ }
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 package mainimport ( "fmt" ) func main () { if num := 10 ; num % 2 == 0 { fmt.Println(num,"is even" ) } else { fmt.Println(num,"is odd" ) } }
需要注意的是,num的定义在if里,那么只能够在该if..else语句块中使用,否则编译器会报错的。
2.3 switch语句:“开关” switch是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较,并根据匹配执行代码块。它可以被认为是一种惯用的方式来写多个if else子句。
switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。 switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。
而如果switch没有表达式,它会匹配true
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。
变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。 您可以同时测试多个可能符合条件的值,使用逗号分割它们 ,例如:case val1, val2, val3。
1 2 3 4 5 6 7 8 switch var1 { case val1: ... case val2: ... default : ... }
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package mainimport "fmt" func main () { var grade string = "B" var marks int = 90 switch marks { case 90 : grade = "A" case 80 : grade = "B" case 50 ,60 ,70 : grade = "C" default : grade = "D" } switch { case grade == "A" : fmt.Printf("优秀!\n" ) case grade == "B" , grade == "C" : fmt.Printf("良好\n" ) case grade == "D" : fmt.Printf("及格\n" ) case grade == "F" : fmt.Printf("不及格\n" ) default : fmt.Printf("差\n" ); } fmt.Printf("你的等级是 %s\n" , grade ); }
2.4 fallthrough 如需贯通后续的case,就添加fallthrough
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package mainimport ( "fmt" ) type data [2 ]int func main () { switch x := 5 ; x { default : fmt.Println(x) case 5 : x += 10 fmt.Println(x) fallthrough case 6 : x += 20 fmt.Println(x) } }
运行结果:
case中的表达式是可选的,可以省略。如果该表达式被省略,则被认为是switch true,并且每个case表达式都被计算为true,并执行相应的代码块。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package mainimport ( "fmt" ) func main () { num := 75 switch { case num >= 0 && num <= 50 : fmt.Println("num is greater than 0 and less than 50" ) case num >= 51 && num <= 100 : fmt.Println("num is greater than 51 and less than 100" ) case num >= 101 : fmt.Println("num is greater than 100" ) } }
switch的注意事项
case后的常量值不能重复
case后可以有多个常量值
fallthrough应该是某个case的最后一行。如果它出现在中间的某个地方,编译器就会抛出错误。
2.5 Type Switch switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
1 2 3 4 5 6 7 8 9 switch x.(type ){ case type : statement(s); case type : statement(s); default : statement(s); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package mainimport "fmt" func main () { var x interface {} 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语言的学习群:784190273
作者B站:
https://space.bilibili.com/353694001
对应视频地址:
https://www.bilibili.com/video/av56018934
https://www.bilibili.com/video/av47467197
源代码:
https://github.com/rubyhan1314/go_foundation