第三章:流程控制 3.1 条件语句 if语句 package mainimport "fmt" func main ( ) { score:= 85 // 基本if语句 if score>= 60 { fmt. Println ( "及格" ) } // if-else语句 if score>= 90 { fmt. Println ( "优秀" ) } else { fmt. Println ( "还需努力" ) } // if-else if-else语句 if score>= 90 { fmt. Println ( "优秀" ) } else if score>= 80 { fmt. Println ( "良好" ) } else if score>= 70 { fmt. Println ( "中等" ) } else if score>= 60 { fmt. Println ( "及格" ) } else { fmt. Println ( "不及格" ) } // if语句带初始化语句 if num:= 10 ; num% 2 == 0 { fmt. Printf ( "%d是偶数\n" , num) } else { fmt. Printf ( "%d是奇数\n" , num) } } switch语句 package mainimport ( "fmt" "time" ) func main ( ) { // 基本switch day:= time. Now ( ) . Weekday ( ) switch day{ case time. Monday: fmt. Println ( "星期一" ) case time. Tuesday: fmt. Println ( "星期二" ) case time. Wednesday: fmt. Println ( "星期三" ) case time. Thursday: fmt. Println ( "星期四" ) case time. Friday: fmt. Println ( "星期五" ) case time. Saturday, time. Sunday: fmt. Println ( "周末" ) default : fmt. Println ( "未知" ) } // 多条件匹配 month:= time. Now ( ) . Month ( ) switch month{ case time. March, time. April, time. May: fmt. Println ( "春天" ) case time. June, time. July, time. August: fmt. Println ( "夏天" ) case time. September, time. October, time. November: fmt. Println ( "秋天" ) case time. December, time. January, time. February: fmt. Println ( "冬天" ) } // 无条件switch score:= 85 switch { case score>= 90 : fmt. Println ( "优秀" ) case score>= 80 : fmt. Println ( "良好" ) case score>= 70 : fmt. Println ( "中等" ) case score>= 60 : fmt. Println ( "及格" ) default : fmt. Println ( "不及格" ) } // 类型switch var xinterface { } = "hello" switch v:= x. ( type ) { case int : fmt. Printf ( "x是int: %d\n" , v) case string : fmt. Printf ( "x是string: %s\n" , v) case bool : fmt. Printf ( "x是bool: %v\n" , v) default : fmt. Printf ( "x是未知类型: %T\n" , v) } // fallthrough关键字 num:= 1 switch num{ case 1 : fmt. Println ( "一" ) fallthrough case 2 : fmt. Println ( "二" ) fallthrough case 3 : fmt. Println ( "三" ) } // 输出: 一 二 三 } 3.2 循环语句 for循环 package mainimport "fmt" func main ( ) { // 基本for循环 fmt. Println ( "基本for循环:" ) for i:= 1 ; i<= 5 ; i++ { fmt. Printf ( "%d " , i) } fmt. Println ( ) // while风格循环 fmt. Println ( "while风格循环:" ) count:= 1 for count<= 5 { fmt. Printf ( "%d " , count) count++ } fmt. Println ( ) // 无限循环 fmt. Println ( "无限循环 (使用break退出):" ) sum:= 0 for { sum+= 1 if sum> 5 { break } fmt. Printf ( "%d " , sum) } fmt. Println ( ) // range遍历数组 fmt. Println ( "range遍历数组:" ) arr:= [ ] int { 10 , 20 , 30 , 40 , 50 } for index, value:= range arr{ fmt. Printf ( "索引: %d, 值: %d\n" , index, value) } // range遍历字符串 fmt. Println ( "range遍历字符串:" ) str:= "Hello, 世界" for i, ch:= range str{ fmt. Printf ( "索引: %d, 字符: %c\n" , i, ch) } // range遍历map fmt. Println ( "range遍历map:" ) scores:= map [ string ] int { "张三" : 90 , "李四" : 85 , "王五" : 95 , } for name, score:= range scores{ fmt. Printf ( "姓名: %s, 分数: %d\n" , name, score) } // range遍历channel fmt. Println ( "range遍历channel:" ) ch:= make ( chan int , 3 ) ch<- 1 ch<- 2 ch<- 3 close ( ch) for v:= range ch{ fmt. Printf ( "%d " , v) } fmt. Println ( ) } break和continue package mainimport "fmt" func main ( ) { // break示例 fmt. Println ( "break示例:" ) for i:= 1 ; i<= 10 ; i++ { if i> 5 { break } fmt. Printf ( "%d " , i) } fmt. Println ( ) // continue示例 fmt. Println ( "continue示例 (跳过偶数):" ) for i:= 1 ; i<= 10 ; i++ { if i% 2 == 0 { continue } fmt. Printf ( "%d " , i) } fmt. Println ( ) // 带标签的break fmt. Println ( "带标签的break:" ) outer: for i:= 1 ; i<= 3 ; i++ { for j:= 1 ; j<= 3 ; j++ { if i== 2 && j== 2 { break outer} fmt. Printf ( "(%d,%d) " , i, j) } } fmt. Println ( ) // 带标签的continue fmt. Println ( "带标签的continue:" ) outer2: for i:= 1 ; i<= 3 ; i++ { for j:= 1 ; j<= 3 ; j++ { if j== 2 { continue outer2} fmt. Printf ( "(%d,%d) " , i, j) } } fmt. Println ( ) } 3.3 goto语句 package mainimport "fmt" func main ( ) { i:= 0 loop: if i< 5 { fmt. Printf ( "%d " , i) i++ goto loop} fmt. Println ( ) } 3.4 defer语句 package mainimport "fmt" func main ( ) { // defer基本用法 fmt. Println ( "开始" ) defer fmt. Println ( "defer 1" ) defer fmt. Println ( "defer 2" ) defer fmt. Println ( "defer 3" ) fmt. Println ( "结束" ) // 输出顺序: 开始 结束 defer 3 defer 2 defer 1 // defer用于资源清理 fmt. Println ( "\n文件操作示例:" ) fmt. Println ( "打开文件" ) defer fmt. Println ( "关闭文件" ) fmt. Println ( "读取文件" ) fmt. Println ( "处理数据" ) // defer与匿名函数 fmt. Println ( "\ndefer与匿名函数:" ) x:= 10 defer func ( ) { fmt. Printf ( "defer中的x: %d\n" , x) } ( ) x= 20 fmt. Printf ( "修改后的x: %d\n" , x) // defer执行顺序 fmt. Println ( "\ndefer执行顺序:" ) for i:= 0 ; i< 5 ; i++ { defer fmt. Printf ( "%d " , i) } fmt. Println ( ) } 3.5 实战案例:成绩统计系统 package mainimport ( "fmt" "sort" ) // Student 学生结构体 type Studentstruct { Namestring Scoreint } func main ( ) { // 学生成绩数据 students:= [ ] Student{ { "张三" , 90 } , { "李四" , 85 } , { "王五" , 95 } , { "赵六" , 78 } , { "钱七" , 92 } , { "孙八" , 88 } , { "周九" , 76 } , { "吴十" , 98 } , } // 统计信息 var totalScoreint maxScore:= 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:= range students{ totalScore+= student. Score// 更新最高分和最低分 if student. Score> maxScore{ maxScore= student. Score maxStudent= student. Name} if student. Score< minScore{ minScore= student. Score minStudent= student. Name} // 统计等级 switch { case student. Score>= 90 : gradeCount[ "优秀" ] ++ case student. Score>= 80 : gradeCount[ "良好" ] ++ case student. Score>= 70 : gradeCount[ "中等" ] ++ case student. 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 { return sortedStudents[ 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成绩等级分布:" ) for grade, count:= range gradeCount{ if count> 0 { percentage:= float64 ( count) / float64 ( len ( students) ) * 100 fmt. Printf ( " %s: %d人 (%.1f%%)\n" , grade, count, percentage) } } fmt. Println ( "\n成绩排名:" ) for i, student:= range sortedStudents{ fmt. Printf ( " 第%d名: %s - %d分\n" , i+ 1 , student. Name, student. Score) } fmt. Println ( "=" + strings. Repeat ( "=" , 50 ) ) }