package main import "fmt" func main() { // 1. 数组:长度固定,所有元素类型相同,索引从 0 开始。 fmt.Println("=== 数组 ===") var scores [3]int = [3]int{80, 90, 75} fmt.Printf("成绩:%v,长度:%d\n", scores, len(scores)) fmt.Printf("第一个成绩:%d\n", scores[0]) scores[2] = 85 fmt.Printf("修改后的成绩:%v\n", scores) // 2. range 遍历数组:得到索引和值。 fmt.Println("\n=== 遍历与求和 ===") sum := 0 for index, score := range scores { fmt.Printf("第 %d 个成绩:%d\n", index+1, score) sum += score } average := float64(sum) / float64(len(scores)) fmt.Printf("总分:%d,平均分:%.2f\n", sum, average) // 3. 切片:类型写作 []int,不指定数组长度。 // append 返回新的切片值,必须接收返回值。 fmt.Println("\n=== 切片与追加 ===") numbers := []int{10, 20, 30} numbers = append(numbers, 40, 50) fmt.Printf("切片:%v,长度:%d\n", numbers, len(numbers)) // 4. 截取切片:左闭右开,包含索引 1,不包含索引 3。 // 子切片和原切片共享底层数组,修改元素可能影响彼此。 fmt.Println("\n=== 截取与共享 ===") middle := numbers[1:3] fmt.Printf("numbers[1:3]:%v\n", middle) middle[0] = 200 fmt.Printf("修改子切片后,原切片:%v\n", numbers) // 5. 使用 make 和 copy 创建独立副本。 // make([]int, n) 创建长度为 n、元素初值为 0 的切片。 fmt.Println("\n=== 复制切片 ===") backup := make([]int, len(numbers)) copied := copy(backup, numbers) backup[0] = 999 fmt.Printf("复制了 %d 个元素,副本:%v\n", copied, backup) fmt.Printf("原切片保持不变:%v\n", numbers) // 6. 切片零值是 nil,长度与容量都是 0,可以直接 append。 fmt.Println("\n=== 从空切片开始 ===") var tasks []string fmt.Printf("追加前:nil=%t,长度=%d,容量=%d\n", tasks == nil, len(tasks), cap(tasks)) tasks = append(tasks, "复习循环", "学习切片") for _, task := range tasks { fmt.Printf("任务:%s\n", task) } // 7. 数组赋值会复制整个数组,与切片赋值的共享行为不同。 fmt.Println("\n=== 数组赋值是复制 ===") otherScores := scores otherScores[0] = 100 fmt.Printf("数组副本:%v,原数组:%v\n", otherScores, scores) }