深入理解Go语言中的切片

深入理解Go语言中的切片

切片的底层实现

Go语言中的切片底层其实是数组+长度+容量

  • array:是指向下层数组某元素的指针,该元素也是切片的起始元素;
  • len:是切片的长度,即切片中当前元素的个数;
  • cap:是切片的最大容量,cap >= len。
1
2
3
4
5
type slice struct {
array unsafe.Pointer
len int
cap int
}

切片的实例化

1
2
s := make([]byte, 5) //底层初始化了一个长度为5的数组
//如果没有在 make 中指定 cap 参数,那么 cap = len,即编译器建立的数组长度为 len。

image-20220531091152637

对已存在的数组进行操作的切片

1
2
u := [10]byte{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
s := u[3:7] //包左不包右

image-20220531091426836

切片的动态扩容

实例

1
2
3
4
5
6
7
8
9
10
11
12
// slice_append.go
var s []int // s被赋予零值nil
s = append(s, 11)
fmt.Println(len(s), cap(s)) //1 1
s = append(s, 12)
fmt.Println(len(s), cap(s)) //2 2
s = append(s, 13)
fmt.Println(len(s), cap(s)) //3 4
s = append(s, 14)
fmt.Println(len(s), cap(s)) //4 4
s = append(s, 15)
fmt.Println(len(s), cap(s)) //5 8
<