Go语言 slice原理 | 青训营笔记

106 阅读2分钟

当创建一个切片时,Go语言会在底层创建一个包含以下三个部分的数据结构:

  1. 指针(Pointer):指向数组的起始位置,也就是切片的第一个元素所在的内存地址。
  2. 长度(Length):表示切片当前包含的元素数量。
  3. 容量(Capacity):表示切片从起始位置开始,可以扩展的元素数量,即切片能够访问的底层数组的长度。 当我们对切片进行操作时,例如追加元素、截取切片等,切片的指针、长度和容量可能会发生变化。这是因为切片本身不存储元素,它只是对底层数组的一个引用,并提供了一种方便的方式来操作底层数组。

当我们追加元素到切片时,如果容量不足以容纳新的元素,Go语言会自动进行扩容。这时,会创建一个新的更大的底层数组,并将原来的元素复制到新的底层数组中。然后,切片的指针会指向新的底层数组,长度被更新为追加元素后的长度,容量也会相应增加。

这种动态扩容的特性使得切片在处理可变长度的数据时非常方便和高效。同时,由于切片与底层数组共享数据,对切片的修改会影响到底层数组,而对底层数组的修改也会反映在切片上。

需要注意的是,切片是引用类型,在函数间传递切片时,传递的是切片的副本,但它们共享底层数组。这意味着对切片的修改在函数外部也可见,而函数内部对切片的修改也会影响到函数外部。

总结一下,Go语言中的切片是一个动态的、灵活的数据结构,通过指针、长度和容量来引用和操作底层数组。切片的底层原理使其成为一种高效且方便的数据结构,用于处理可变长度的序列。