| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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)
- }
|