2021-07-20 16:32:32
在 Go 语言中,由于数组类型需要在编译时指定长度,无法直接动态分配数组内存,但可通过切片(slice)实现类似功能。切片是底层数组的抽象,支持动态调整大小,其核心方法是通过 make 函数创建。以下是具体实现方法及示例:
核心方法:使用 make 创建切片make 函数的签名如下:
make([]T, length, capacity)动态大小:
变量 n 可在运行时确定(如通过用户输入或计算得出),切片长度和容量基于此值动态分配。
若未指定容量(如 make([]int, n)),容量默认等于长度。
长度与容量:
长度(length):切片中当前存储的元素数量,通过 len(slice) 获取。
容量(capacity):底层数组的总大小,通过 cap(slice) 获取。当切片长度超过容量时,Go 会自动触发扩容(分配新数组并复制数据)。
扩容机制:
扩容时,Go 会分配一个更大的底层数组(通常为当前容量的 2 倍),并将原数据复制到新数组。频繁扩容可能导致性能开销,因此预分配足够容量(如 make([]int, n, 2*n))可优化性能。
初始化元素:
创建切片后,可通过循环或直接赋值初始化元素(如示例中的 mySlice[i] = i * 2)。
new([]T) 返回指向切片的指针(*[]T),但切片本身为空(长度和容量为 0),通常不用于动态内存分配。
make 直接初始化切片并分配底层数组,是更常用的方式。
预分配足够容量可减少扩容次数。例如,若已知切片最终需要存储 100 个元素,可初始化为 make([]int, 0, 100),再通过 append 动态添加。
在 Go 中,切片是动态管理数组内存的核心工具。通过 make 函数指定长度和容量,可在运行时灵活分配内存,同时利用切片的自动扩容机制处理不确定大小的数据。理解长度与容量的区别,并合理预分配容量,是编写高效 Go 代码的关键。