在go语言中,数组变量属于值类型,因此当一个数组变量被复制或者传递时,实际上会复制整个数组。eg,将a赋值给b,修改a中的元素,并不会修改b中的元素。为了避免复制数组,一般会传递指向数组的指针。
package main
import "fmt"
func main() {
a := [...]int{1, 2, 3}
b := a
a[0] = 100
fmt.Println(a)
fmt.Println(b)
}
输出结果:
【100,2,3】
【1,2,3】
切片的底层是依赖数组实现的,相关初始化操作可以见笔者之前的博客,会有详细的介绍。切片和数组很相似,按照下标进行索引。切片本质是一个数组片段的描述,包括了数组的指针,这个片段的长度和容量(不改变内存分配情况下的最大长度)。切片操作并不复制切片指向的元素,创建一个新的切片会复用原来切片的底层数组,因此切片操作是非常高效的。
在已有切片的基础上进行切片,不会创建新的底层数组。因为原来的底层数组没有发生变化,内存会一直占用,直到没有变量引用该数组。因此很可能出现这么一种情况,原切片由大量的元素构成,但是我们在原切片的基础上切片,虽然只使用了很小一段,但底层数组在内存中仍然占据了大量空间,得不到释放。比较推荐的做法,使用 copy
替代 re-slice
。
标签:切片,slice,--,fmt,Golang,复制,数组,底层 From: https://www.cnblogs.com/99kol/p/17459003.html