go语言切片

发布时间 2023-06-05 14:36:45作者: 自然洒脱

特性

长度可变、 内容可变、 引用类型、 底层基于数组

定义

var s1 []int               // 长度、容量为0的切片,零值
var s2 = []int{}           // 长度、容量为0的切片,字面量定义
var s3 = []int{1, 3, 5}    // 字面量定义,长度、容量都是3
var s4 = make([]int, 0)    // 长度、容量为0的切片,make([]T, length)
var s5 = make([]int, 3, 5) // 长度为3,容量为5,底层数组为长度为5,元素长度为3,所以显
示[0, 0, 0]

与数组不同,切片的cap和长度len不再相同。

内存模型

切片本质是对底层数组一个连续片段的引用。此片段可以是整个底层数组,也可以是由起始和终止索引 标识的一些项的子集。

在go的源码(https://github.com/golang/go/blob/master/src/runtime/slice.go)中可以看到切片是有结构体的,切片结构体的标头值有三个:

 

s := []int{1, 3, 5, 7}
fmt.Printf("%v, %p, %p", s, &s, &s[0])
// &a是切片结构体的地址,&a[0]是底层数组的地址。