go20/day05/loop/main.go
yumaojun03 015e08a21d ```
feat(loop): 添加Go语言循环语句示例代码

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

163 lines
3.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}