Post

slice与array

slice与array

slice and array

  • 相同点

    • len()获取长度,通过下表获取
    • 分配一块连续的内存空间
  • array

    • 值类型
    • var,:= 创建,
    • 不可用make(运行时)、appendcopy
    • 创建后长度、容量不可改变
  • slice

    1
    2
    3
    4
    5
    6
    
    // slice 源代码表示
    type SliceHeader struct {
    	Data uintptr // 指向底层数组
    	Len  int
    	Cap  int
    }
    
    • 引用类型
    • var,:= 、make创建
    • 可扩充,1024个元素内2倍增长,往后1/4增长
    • 底层实现是指向一个array,容量为底层array的大小

使用场景

  • 一般使用slice
  • 不确定len用 slice,确定大小使用array

完整表达式

作用于 Array 和 Slice

1
2
3
4
5
a[low : high : max]
     |    |     |
     |    |     └── cap 的右边界(cap = max - low)
     |    └──────── len 的右边界(len = high - low)
     └───────────── 起始位置
1
2
3
4
5
6
7
8
9
10
11
original := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

//                           底层数组
//  index:  0  1  2  3  4  5  6  7  8  9

s1 := original[2:5]    // [2,3,4]  cap=8  可以看到 index 2~9
s2 := original[2:5:6]  // [2,3,4]  cap=4  只能看到 index 2~5
s3 := original[2:5:5]  // [2,3,4]  cap=3  只能看到 index 2~4

// s1 append 不扩容 → 覆盖 original[5]
// s3 append 必扩容 → 独立副本

为什么需要完整表达式?

防止子 slice/array 因为共享底层数组而污染数据。

This post is licensed under CC BY 4.0 by the author.