能否介绍一下Golang中的slice底层数据结构和特性?

Go语言中的切片(slice)是一种动态数组,它的底层数据结构包括三个关键的属性:指针、长度和容量。

  1. 指针(Pointer):指向数组的第一个元素。
  2. 长度(Length):当前切片的长度,即包含的元素数量。
  3. 容量(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() 创建了一个新的底层数组,并将原始切片的数据复制到新数组中,然后返回了新的切片。新切片的容量是原始切片的容量的两倍。

发表评论

后才能评论