feat(loop): 添加Go语言循环语句示例代码

新增完整的循环语句教学内容,包括:
- for循环的基础用法和range遍历
- slice和map的遍历示例
- 九九乘法表实现
- 素数查找算法
- break和continue语句使用
- 标签(label)和goto语句演示
- 实际应用场景如成绩统计和数据清洗
同时更新README文件添加课程链接
```
This commit is contained in:
yumaojun03 2026-02-08 12:03:29 +08:00
parent e802a2e4e9
commit 015e08a21d
2 changed files with 167 additions and 1 deletions

View File

@ -1 +1,5 @@
# 循环语句
# 循环语句
[课件](https://gitee.com/infraboard/go-course/blob/master/zh-cn/base/for.md)

162
day05/loop/main.go Normal file
View File

@ -0,0 +1,162 @@
package main
import (
"fmt"
)
func main() {
arr01 := []int{1, 2, 3, 4, 5}
// slices for
for index, value := range arr01 {
// 是值的副本,不能修改(改变不了外部的值, 不能修改这个值来修改array)
fmt.Println(index, arr01[index])
fmt.Println(value)
// 改变slice
arr01[index] = 10
}
m01 := map[string]int{"a": 1, "b": 2, "c": 3}
// map for
for key, value := range m01 {
// 是值的副本,不能修改(改变不了外部的值, 不能修改这个值来修改map)
fmt.Println(key, m01[key])
fmt.Println(value)
// 修改map
m01[key] = 10
}
// n * m 乘法表
// n 从1到9(乘数), m 从1到n(被乘数)
for m := 1; m <= 9; m++ {
// m: 1, n: 1
// m: 2, n: 1, 2
// m: 3, n: 1, 2, 3
// m: 4, n: 1, 2, 3, 4
// ...
for n := 1; n <= m; n++ {
fmt.Printf("%d×%d=%-2d ", n, m, m*n)
}
fmt.Println()
}
fmt.Println("2-100之间的素数")
// 遍历 2 到 100
for num := 2; num <= 100; num++ {
isPrime := true // 假设是素数
// 检查能否被2到√num之间的数整除
// 再通过循环检查 从2到num的数, 是否能整除(求模有没有余数: %); 9 (1 * 5, 2 *4, 3 * 3, 4 * 2, 5 * 1)
for divisor := 2; divisor*divisor <= num; divisor++ {
if num%divisor == 0 {
isPrime = false
break // 找到一个因数就可以退出了
}
}
if isPrime {
fmt.Printf("%d ", num)
}
}
fmt.Println()
// 不使用标签(GOTO):只跳出内层循环
fmt.Println("---- 不使用标签 ----")
for i := 1; i <= 3; i++ {
fmt.Printf("外层: %d\n", i)
for j := 1; j <= 3; j++ {
fmt.Printf(" 内层: %d\n", j)
if j == 2 {
break // 只跳出内层循环
}
}
}
// 使用标签:跳出外层循环
fmt.Println("---- 使用标签 ----")
OuterLoop: // 定义标签 (定义程序的锚点,使用 goto或者break 跳转的锚点)
for i := 1; i <= 3; i++ {
fmt.Printf("外层: %d\n", i)
for j := 1; j <= 3; j++ {
fmt.Printf(" 内层: %d\n", j)
if j == 2 {
break OuterLoop // 跳出到标签处,即外层循环
}
}
}
fmt.Println("---- 跳过偶数 ----")
for i := 1; i <= 10; i++ {
if i%2 == 0 {
continue // 跳过偶数
}
fmt.Printf("%d ", i)
}
// 输出: 1 3 5 7 9
var count int = 1
LOOP: // 定义标签
if count <= 5 {
fmt.Printf("计数: %d\n", count)
count++
goto LOOP // 跳回标签
}
fmt.Println("结束")
fmt.Println("---- 统计学生成绩 ----")
// 统计学生成绩
scores := []int{85, 92, 78, 95, 88, 73, 90, 85, 79, 91}
var sum, max, min int
max = scores[0]
min = scores[0]
for _, score := range scores {
sum += score
if score > max {
max = score
}
if score < min {
min = score
}
}
average := float64(sum) / float64(len(scores))
fmt.Printf("平均分: %.2f\n", average)
fmt.Printf("最高分: %d\n", max)
fmt.Printf("最低分: %d\n", min)
fmt.Println("---- 清洗用户输入的电话号码列表 ----")
// 清洗用户输入的电话号码列表
phoneNumbers := []string{"138-1234-5678", "159-xxxx-9999", "186-8888-8888", "invalid", "177-9999-0000"}
validPhones := []string{}
for _, phone := range phoneNumbers {
// 简单验证长度为13包含两个短横线
if len(phone) != 13 {
continue // 跳过无效号码
}
if phone[3] != '-' || phone[8] != '-' {
continue
}
// 判断所有字符都是数字,不是字母
if !IsNumber(phone[:3]) || !IsNumber(phone[4:8]) || !IsNumber(phone[9:13]) {
continue
}
validPhones = append(validPhones, phone)
}
fmt.Printf("有效电话号码: %v\n", validPhones)
}
func IsNumber(s string) bool {
for _, char := range s {
if char < '0' || char > '9' {
return false
}
}
return true
}