Skip to content

1.5 数组与切片 ​

数组 ​

go
package main

import "fmt"

func main() {
    // 数组声明
    var arr1 [5]int           // [0 0 0 0 0]
    arr2 := [5]int{1, 2, 3, 4, 5}
    arr3 := [...]int{1, 2, 3}  // 编译器推断长度

    // 数组访问
    arr2[0] = 100
    fmt.Println(arr2[0])

    // 数组遍历
    for i, v := range arr3 {
        fmt.Println(i, v)
    }

    // 数组是值类型
    a := [3]int{1, 2, 3}
    b := a  // 复制整个数组
    b[0] = 100
    fmt.Println(a)  // [1 2 3] - 不变

    // 多维数组
    matrix := [2][3]int{{1, 2, 3}, {4, 5, 6}}
    fmt.Println(matrix[0][1])  // 2
}

切片 ​

go
package main

import "fmt"

func main() {
    // 从数组创建
    arr := [5]int{1, 2, 3, 4, 5}
    slice := arr[1:4]  // [2 3 4]

    // 直接创建
    s := []int{1, 2, 3}

    // make 创建
    s1 := make([]int, 5)       // 长度 5
    s2 := make([]int, 3, 5)    // 长度 3,容量 5

    // 切片属性
    fmt.Println(len(s))  // 长度
    fmt.Println(cap(s))  // 容量

    // 切片是引用类型
    sub := s[1:3]
    sub[0] = 200
    fmt.Println(s)  // [1 200 3]
}

append 和 copy ​

go
package main

import "fmt"

func main() {
    // append
    s := []int{1, 2, 3}
    s = append(s, 4)           // [1 2 3 4]
    s = append(s, 5, 6, 7)     // [1 2 3 4 5 6 7]
    s = append(s, []int{8, 9}...)  // 追加另一个切片

    // copy
    src := []int{1, 2, 3, 4, 5}
    dst := make([]int, 3)
    copy(dst, src)  // dst = [1 2 3]

    // 原地删除
    arr := []int{1, 2, 3, 4, 5}
    i := 2
    arr = append(arr[:i], arr[i+1:]...)  // [1 2 4 5]
}

切片扩容机制 ​

go
package main

import "fmt"

func main() {
    // 扩容策略:
    // 1. 容量 < 256: 新容量 = 旧容量 * 2
    // 2. 容量 >= 256: 新容量 = 旧容量 * 1.25

    var s []int
    for i := 0; i < 20; i++ {
        s = append(s, i)
        fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
    }
}

多维切片 ​

go
package main

import "fmt"

func main() {
    // 二维切片
    matrix := [][]int{
        {1, 2, 3},
        {4, 5, 6},
    }

    // make 创建
    rows, cols := 3, 4
    m := make([][]int, rows)
    for i := range m {
        m[i] = make([]int, cols)
    }

    // 遍历
    for _, row := range matrix {
        for _, v := range row {
            fmt.Print(v, " ")
        }
        fmt.Println()
    }
}