一、程序的流程结构
程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。
顺序结构:从上向下,逐行执行。
选择结构:条件满足,某些代码才会执行。0-1次
分支语句:if,switch,select
循环结构:条件满足,某些代码会被反复的执行多次。0-N次
循环语句:for
语法格式:
if布尔表达式{/* 在布尔表达式为 true 时执行 */}
if布尔表达式{/* 在布尔表达式为 true 时执行 */}else{/* 在布尔表达式为 false 时执行 */}
if布尔表达式1{/* 在布尔表达式1为 true 时执行 */}elseif布尔表达式2{/* 在布尔表达式1为 false ,布尔表达式2为true时执行 */}else{/* 在上面两个布尔表达式都为false时,执行*/}
示例代码:
packagemainimport"fmt"funcmain(){/* 定义局部变量 */varaint=10 /* 使用 if 语句判断布尔表达式 */ifa<20{/* 如果条件为 true 则执行以下语句 */fmt.Printf("a 小于 20\n")}fmt.Printf("a 的值为 : %d\n",a)}
如果其中包含一个可选的语句组件(在评估条件之前执行),则还有一个变体。它的语法是
ifstatement;condition{}ifcondition{ }
示例代码:
packagemainimport("fmt")funcmain(){ifnum:=10;num%2==0{//checks if number is evenfmt.Println(num,"is even")}else{fmt.Println(num,"is odd")}}
需要注意的是,num的定义在if里,那么只能够在该if..else语句块中使用,否则编译器会报错的。
switch是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较,并根据匹配执行代码块。它可以被认为是一种惯用的方式来写多个if else子句。
switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。 switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。
而如果switch没有表达式,它会匹配true
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。
变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。 您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。
switchvar1{caseval1:...caseval2:...default:...}
示例代码:
packagemainimport"fmt"funcmain(){/* 定义局部变量 */vargradestring="B"varmarksint=90switchmarks{case90:grade="A"case80:grade="B"case50,60,70:grade="C"//case 后可以由多个数值default:grade="D"}switch{casegrade=="A":fmt.Printf("优秀!\n")casegrade=="B",grade=="C":fmt.Printf("良好\n")casegrade=="D":fmt.Printf("及格\n")casegrade=="F":fmt.Printf("不及格\n")default:fmt.Printf("差\n");}fmt.Printf("你的等级是 %s\n",grade);}
如需贯通后续的case,就添加fallthrough
packagemainimport("fmt")typedata[2]intfuncmain(){switchx:=5;x{default:fmt.Println(x)case5:x+=10fmt.Println(x)fallthroughcase6:x+=20fmt.Println(x)}}
运行结果:
1535
case中的表达式是可选的,可以省略。如果该表达式被省略,则被认为是switch true,并且每个case表达式都被计算为true,并执行相应的代码块。
示例代码:
packagemainimport("fmt")funcmain(){num:=75switch{// expression is omittedcasenum>=0&&num<=50:fmt.Println("num is greater than 0 and less than 50")casenum>=51&&num<=100:fmt.Println("num is greater than 51 and less than 100")casenum>=101:fmt.Println("num is greater than 100")}}
switch的注意事项
case后的常量值不能重复
case后可以有多个常量值
fallthrough应该是某个case的最后一行。如果它出现在中间的某个地方,编译器就会抛出错误。
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
switchx.(type){casetype:statement(s);casetype:statement(s);/* 你可以定义任意个数的case */default:/* 可选 */statement(s);}
packagemainimport"fmt"funcmain(){varxinterface{} switchi:=x.(type){casenil:fmt.Printf(" x 的类型 :%T",i)caseint:fmt.Printf("x 是 int 型")casefloat64:fmt.Printf("x 是 float64 型")casefunc(int)float64:fmt.Printf("x 是 func(int) 型")casebool,string:fmt.Printf("x 是 bool 或 string 型")default:fmt.Printf("未知型")}}
运行结果:
x的类型:<nil>
千锋Go语言的学习群:784190273
作者B站:
https://space.bilibili.com/353694001
对应视频地址:
https://www.bilibili.com/video/av56018934
https://www.bilibili.com/video/av47467197
源代码: