第三章:流程控制
3.1 条件语句
if语句
packagemainimport"fmt"funcmain(){score:=85// 基本if语句ifscore>=60{fmt.Println("及格")}// if-else语句ifscore>=90{fmt.Println("优秀")}else{fmt.Println("还需努力")}// if-else if-else语句ifscore>=90{fmt.Println("优秀")}elseifscore>=80{fmt.Println("良好")}elseifscore>=70{fmt.Println("中等")}elseifscore>=60{fmt.Println("及格")}else{fmt.Println("不及格")}// if语句带初始化语句ifnum:=10;num%2==0{fmt.Printf("%d是偶数\n",num)}else{fmt.Printf("%d是奇数\n",num)}}switch语句
packagemainimport("fmt""time")funcmain(){// 基本switchday:=time.Now().Weekday()switchday{casetime.Monday:fmt.Println("星期一")casetime.Tuesday:fmt.Println("星期二")casetime.Wednesday:fmt.Println("星期三")casetime.Thursday:fmt.Println("星期四")casetime.Friday:fmt.Println("星期五")casetime.Saturday,time.Sunday:fmt.Println("周末")default:fmt.Println("未知")}// 多条件匹配month:=time.Now().Month()switchmonth{casetime.March,time.April,time.May:fmt.Println("春天")casetime.June,time.July,time.August:fmt.Println("夏天")casetime.September,time.October,time.November:fmt.Println("秋天")casetime.December,time.January,time.February:fmt.Println("冬天")}// 无条件switchscore:=85switch{casescore>=90:fmt.Println("优秀")casescore>=80:fmt.Println("良好")casescore>=70:fmt.Println("中等")casescore>=60:fmt.Println("及格")default:fmt.Println("不及格")}// 类型switchvarxinterface{}="hello"switchv:=x.(type){caseint:fmt.Printf("x是int: %d\n",v)casestring:fmt.Printf("x是string: %s\n",v)casebool:fmt.Printf("x是bool: %v\n",v)default:fmt.Printf("x是未知类型: %T\n",v)}// fallthrough关键字num:=1switchnum{case1:fmt.Println("一")fallthroughcase2:fmt.Println("二")fallthroughcase3:fmt.Println("三")}// 输出: 一 二 三}3.2 循环语句
for循环
packagemainimport"fmt"funcmain(){// 基本for循环fmt.Println("基本for循环:")fori:=1;i<=5;i++{fmt.Printf("%d ",i)}fmt.Println()// while风格循环fmt.Println("while风格循环:")count:=1forcount<=5{fmt.Printf("%d ",count)count++}fmt.Println()// 无限循环fmt.Println("无限循环 (使用break退出):")sum:=0for{sum+=1ifsum>5{break}fmt.Printf("%d ",sum)}fmt.Println()// range遍历数组fmt.Println("range遍历数组:")arr:=[]int{10,20,30,40,50}forindex,value:=rangearr{fmt.Printf("索引: %d, 值: %d\n",index,value)}// range遍历字符串fmt.Println("range遍历字符串:")str:="Hello, 世界"fori,ch:=rangestr{fmt.Printf("索引: %d, 字符: %c\n",i,ch)}// range遍历mapfmt.Println("range遍历map:")scores:=map[string]int{"张三":90,"李四":85,"王五":95,}forname,score:=rangescores{fmt.Printf("姓名: %s, 分数: %d\n",name,score)}// range遍历channelfmt.Println("range遍历channel:")ch:=make(chanint,3)ch<-1ch<-2ch<-3close(ch)forv:=rangech{fmt.Printf("%d ",v)}fmt.Println()}break和continue
packagemainimport"fmt"funcmain(){// break示例fmt.Println("break示例:")fori:=1;i<=10;i++{ifi>5{break}fmt.Printf("%d ",i)}fmt.Println()// continue示例fmt.Println("continue示例 (跳过偶数):")fori:=1;i<=10;i++{ifi%2==0{continue}fmt.Printf("%d ",i)}fmt.Println()// 带标签的breakfmt.Println("带标签的break:")outer:fori:=1;i<=3;i++{forj:=1;j<=3;j++{ifi==2&&j==2{breakouter}fmt.Printf("(%d,%d) ",i,j)}}fmt.Println()// 带标签的continuefmt.Println("带标签的continue:")outer2:fori:=1;i<=3;i++{forj:=1;j<=3;j++{ifj==2{continueouter2}fmt.Printf("(%d,%d) ",i,j)}}fmt.Println()}3.3 goto语句
packagemainimport"fmt"funcmain(){i:=0loop:ifi<5{fmt.Printf("%d ",i)i++gotoloop}fmt.Println()}3.4 defer语句
packagemainimport"fmt"funcmain(){// defer基本用法fmt.Println("开始")deferfmt.Println("defer 1")deferfmt.Println("defer 2")deferfmt.Println("defer 3")fmt.Println("结束")// 输出顺序: 开始 结束 defer 3 defer 2 defer 1// defer用于资源清理fmt.Println("\n文件操作示例:")fmt.Println("打开文件")deferfmt.Println("关闭文件")fmt.Println("读取文件")fmt.Println("处理数据")// defer与匿名函数fmt.Println("\ndefer与匿名函数:")x:=10deferfunc(){fmt.Printf("defer中的x: %d\n",x)}()x=20fmt.Printf("修改后的x: %d\n",x)// defer执行顺序fmt.Println("\ndefer执行顺序:")fori:=0;i<5;i++{deferfmt.Printf("%d ",i)}fmt.Println()}3.5 实战案例:成绩统计系统
packagemainimport("fmt""sort")// Student 学生结构体typeStudentstruct{NamestringScoreint}funcmain(){// 学生成绩数据students:=[]Student{{"张三",90},{"李四",85},{"王五",95},{"赵六",78},{"钱七",92},{"孙八",88},{"周九",76},{"吴十",98},}// 统计信息vartotalScoreintmaxScore:=students[0].Score minScore:=students[0].Score maxStudent:=students[0].Name minStudent:=students[0].Name// 成绩等级统计gradeCount:=map[string]int{"优秀":0,"良好":0,"中等":0,"及格":0,"不及格":0,}// 遍历统计for_,student:=rangestudents{totalScore+=student.Score// 更新最高分和最低分ifstudent.Score>maxScore{maxScore=student.Score maxStudent=student.Name}ifstudent.Score<minScore{minScore=student.Score minStudent=student.Name}// 统计等级switch{casestudent.Score>=90:gradeCount["优秀"]++casestudent.Score>=80:gradeCount["良好"]++casestudent.Score>=70:gradeCount["中等"]++casestudent.Score>=60:gradeCount["及格"]++default:gradeCount["不及格"]++}}// 计算平均分avgScore:=float64(totalScore)/float64(len(students))// 按成绩排序sortedStudents:=make([]Student,len(students))copy(sortedStudents,students)sort.Slice(sortedStudents,func(i,jint)bool{returnsortedStudents[i].Score>sortedStudents[j].Score})// 输出结果fmt.Println("="+strings.Repeat("=",50))fmt.Println("学生成绩统计系统")fmt.Println("="+strings.Repeat("=",50))fmt.Printf("\n学生总数: %d\n",len(students))fmt.Printf("总分: %d\n",totalScore)fmt.Printf("平均分: %.2f\n",avgScore)fmt.Printf("最高分: %d (%s)\n",maxScore,maxStudent)fmt.Printf("最低分: %d (%s)\n",minScore,minStudent)fmt.Println("\n成绩等级分布:")forgrade,count:=rangegradeCount{ifcount>0{percentage:=float64(count)/float64(len(students))*100fmt.Printf(" %s: %d人 (%.1f%%)\n",grade,count,percentage)}}fmt.Println("\n成绩排名:")fori,student:=rangesortedStudents{fmt.Printf(" 第%d名: %s - %d分\n",i+1,student.Name,student.Score)}fmt.Println("="+strings.Repeat("=",50))}