能否介绍一下Golang中的slice底层数据结构和特性?
Go语言中的切片(slice)是一种动态数组,它的底层数据结构包括三个关键的属性:指针、长度和容量。
- 指针(Pointer):指向数组的第一个元素。
- 长度(Length):当前切片的长度,即包含的元素数量。
- 容量(Capacity):从切片的开始位置到底层数组的结尾位置的元素数量。
Go语言的切片是引用类型,它们不存储任何数据,只描述底层数组的一段。更改切片的元素会修改其底层数组中的对应元素。
切片的长度和容量可以通过内置的 len()
和 cap()
函数获取。您可以通过 append()
函数向切片添加元素。如果添加的元素数量超过切片的容量,append()
会创建一个新的底层数组,并将原始数据复制到新数组中,然后返回新的切片。
这是一个简单的例子:
package main
import "fmt"
func main() {
// 创建一个切片
s := []int{1, 2, 3}
fmt.Println(len(s), cap(s)) // 输出:3 3
// 添加一个元素
s = append(s, 4)
fmt.Println(len(s), cap(s)) // 输出:4 6
}
在这个例子中,我们首先创建了一个包含三个元素的切片。然后,我们向切片添加了一个元素,因为切片的容量不足以容纳新的元素,所以 append()
创建了一个新的底层数组,并将原始切片的数据复制到新数组中,然后返回了新的切片。新切片的容量是原始切片的容量的两倍。