Z
ZHANK
复合类型

切片 Slice

[]T 动态长度、make/append/copy、len/cap、切片截取 [low:high]

切片 Slice

Slice 是 Go 最重要的数据结构。 它是数组的"视图"——动态长度、共享底层数组、高效传递。

学完本章你将: 掌握 []T、make/append/copy、len/cap、切片截取 [low:high]。


创建切片

go
package main

import "fmt"

func main() {
    // 直接声明
    s1 := []int{1, 2, 3, 4, 5}

    // make 创建(指定长度和容量)
    s2 := make([]int, 3)       // len=3, cap=3, [0 0 0]
    s3 := make([]int, 3, 10)   // len=3, cap=10

    // 从数组/切片截取
    arr := [5]int{1, 2, 3, 4, 5}
    s4 := arr[1:4]              // [2 3 4](索引 1 到 3)
    s5 := arr[:3]               // [1 2 3]
    s6 := arr[2:]               // [3 4 5]

    fmt.Println(s1, s2, s3, s4, s5, s6)
}

append / copy

go
s := []int{1, 2, 3}

// append —— 追加元素(可能触发扩容)
s = append(s, 4, 5)            // [1 2 3 4 5]
s = append(s, []int{6, 7}...)  // 追加另一个切片(... 展开)

// copy —— 复制元素
src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src)

len vs cap

go
s := make([]int, 3, 10)
fmt.Println(len(s))  // 3(切片中的元素数)
fmt.Println(cap(s))  // 10(底层数组的容量)

// 当 append 超出 cap 时,Go 会自动分配更大的底层数组

💡 核心概念: 切片由三部分组成——ptr(指向底层数组)、len(当前长度)、cap(容量)。传给函数时只拷贝这个三元组(24 字节),不拷贝数据。