Go语言切片类型、数组和切片的区别(slice)

Go语言的切片类型、数组和切片的区别

切片slice、也叫动态数组;

切片的数据结构:

1
2
3
4
5
6
7
// 源码来自Go 1.19
// 源码包:/usr/local/go/src/runtime/slice.go
type slice struct {
array unsafe.Pointer // 底层数组
len int // 切片的长度
cap int // 切片的容量
}

切片和数组的区别

  • ①、切片是指针类型,数组是值类型
  • ②、数组的长度是固定的,而切片长度可以自动扩容(切片是动态的数组)
  • ③、数组只有长度一个属性,而切片比数组多了一个容量(cap)属性
  • ④、切片的底层也是数组实现的

切片的扩容规则

  • ①、如果原slice的容量小于1024,则新slice的容量将扩大为原来的2倍;
  • ②、如果原slice的容量大于或等于1024,则新slice的容量将扩大为原来的1.25倍;

理解切片的长度和容量

1
2
3
4
5
slice := []int{10, 20, 30, 40, 50}
new := slice[1:3]
fmt.Println(new) // [20, 30]
fmt.Println(len(new)) // 2
fmt.Println(cap(new)) // 4

切片的使用例子

声明、初始化切片

1
2
// 变量声明
var s []int
1
2
3
// 字面量声明
s1 := []int{}
s2 := []int{1, 2, 3}
1
2
3
// 使用内置函数make创建
s1 := make([]int, 12) // 指定长度
s2 := make([]int, 10, 100) // 指定长度和空间

基于数组创建切片例子

1
2
3
4
5
6
array := [5]int{1,2,3,4,5}
s1 := array[0:2] // 1 2
s2 := array[0:1] // 1

fmt.Println(s1)
fmt.Println(s2)