Golang高性能编程--slice的学习总结

在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

 

posted @ 2023-06-05 21:37  99号的格调  阅读(25)  评论(0编辑  收藏  举报