Skip to content

slices.go

文件信息

  • 📄 原文件:03_slices.go
  • 🔤 语言:go

完整代码

go
package main

import "fmt"

func main03() {
	fmt.Println("\n ====================  03_slices ====================")
	// ========== 数组 ==========
	fmt.Println("=== 数组 ===")

	// 声明数组(固定长度)
	var arr1 [5]int
	fmt.Println("零值数组:", arr1)

	// 初始化数组
	arr2 := [5]int{1, 2, 3, 4, 5}
	fmt.Println("初始化数组:", arr2)

	// 部分初始化
	arr3 := [5]int{1, 2} // 其余为零值
	fmt.Println("部分初始化:", arr3)

	// 自动推断长度
	arr4 := []string{"Go", "Python", "Java"}
	fmt.Println("自动长度:", arr4, "长度:", len(arr4))

	// 指定索引初始化
	arr5 := [5]int{1: 10, 3: 30}
	fmt.Println("指定索引:", arr5)

	// 访问和修改
	arr2[0] = 100
	fmt.Println("修改后:", arr2)
	fmt.Println("第一个元素:", arr2[0])

	// ========== 切片 ==========
	fmt.Println("\n=== 切片 ===")

	// 从数组创建切片
	arr := [5]int{1, 2, 3, 4, 5}
	slice1 := arr[1:4] // [2, 3, 4]
	fmt.Println("从数组切片:", slice1)

	// 切片字面量
	slice2 := []int{10, 20, 30, 40, 50}
	fmt.Println("切片字面量:", slice2)

	// make 创建切片
	slice3 := make([]int, 3)     // 长度3,容量3
	slice4 := make([]int, 3, 10) // 长度3,容量10
	fmt.Printf("make 切片: %v, len=%d, cap=%d\n", slice3, len(slice3), cap(slice3))
	fmt.Printf("make 切片: %v, len=%d, cap=%d\n", slice4, len(slice4), cap(slice4))

	// 切片操作
	s := []int{0, 1, 2, 3, 4, 5}
	fmt.Println("原切片:", s)
	fmt.Println("s[2:4]:", s[2:4]) // [2, 3]
	fmt.Println("s[:3]:", s[:3])   // [0, 1, 2]
	fmt.Println("s[3:]:", s[3:])   // [3, 4, 5]
	fmt.Println("s[:]:", s[:])     // 全部

	// ========== append ==========
	fmt.Println("\n=== append ===")

	nums := []int{1, 2, 3}
	fmt.Println("原切片:", nums)

	// 追加元素
	nums = append(nums, 4)
	fmt.Println("追加一个:", nums)

	// 追加多个
	nums = append(nums, 5, 6, 7)
	fmt.Println("追加多个:", nums)

	// 追加另一个切片
	more := []int{8, 9}
	nums = append(nums, more...) // 注意 ... 展开
	fmt.Println("追加切片:", nums)

	// ========== copy ==========
	fmt.Println("\n=== copy ===")

	src := []int{1, 2, 3, 4, 5}
	dst := make([]int, 3)
	copied := copy(dst, src)
	fmt.Printf("复制了 %d 个元素: %v\n", copied, dst)

	// ========== 切片是引用类型 ==========
	fmt.Println("\n=== 切片是引用类型 ===")

	original := []int{1, 2, 3}
	reference := original
	reference[0] = 100
	fmt.Println("原切片也被修改:", original)

	// ========== 二维切片 ==========
	fmt.Println("\n=== 二维切片 ===")

	matrix := [][]int{
		{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9},
	}
	fmt.Println("二维切片:")
	for i, row := range matrix {
		fmt.Printf("  行%d: %v\n", i, row)
	}

	// ========== nil 切片 vs 空切片 ==========
	fmt.Println("\n=== nil 切片 vs 空切片 ===")

	var nilSlice []int
	emptySlice := []int{}
	makeSlice := make([]int, 0)

	fmt.Printf("nil 切片: %v, len=%d, nil=%t\n", nilSlice, len(nilSlice), nilSlice == nil)
	fmt.Printf("空切片: %v, len=%d, nil=%t\n", emptySlice, len(emptySlice), emptySlice == nil)
	fmt.Printf("make 空切片: %v, len=%d, nil=%t\n", makeSlice, len(makeSlice), makeSlice == nil)
}

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布