设计思路
- 自定义数据结构:创建一个结构体,内部包含一个数组用于存储元素,以及一个记录当前元素数量的字段。
- 追加元素功能:实现一个方法,在该方法中判断当前数组容量是否足够,如果不足则进行扩容,然后将新元素追加到数组中。
- 扩容机制:当需要扩容时,以一定比例增加数组容量,例如翻倍,以减少频繁扩容带来的性能开销。
关键代码实现
package main
import "fmt"
// 自定义数据结构
type MySlice struct {
data []int
length int
}
// 创建新的MySlice实例
func NewMySlice() *MySlice {
return &MySlice{
data: make([]int, 0, 10), // 初始容量设为10
length: 0,
}
}
// 追加元素方法
func (ms *MySlice) Append(num int) {
if ms.length == cap(ms.data) {
newCapacity := cap(ms.data) * 2
newData := make([]int, ms.length, newCapacity)
copy(newData, ms.data)
ms.data = newData
}
ms.data[ms.length] = num
ms.length++
}
// 获取元素方法
func (ms *MySlice) Get(index int) (int, bool) {
if index < 0 || index >= ms.length {
return 0, false
}
return ms.data[index], true
}
// 获取长度方法
func (ms *MySlice) Len() int {
return ms.length
}
不同场景下扩容策略的考虑
- 小数据量场景:初始容量可以设置较小,如10,避免过多的内存浪费。扩容比例可以选择翻倍,因为数据量小,翻倍扩容不会造成过多的额外内存占用,同时也能减少扩容次数。
- 大数据量场景:初始容量可以根据预估数据量进行设置,减少初始阶段的扩容次数。扩容比例也可以翻倍,但如果对内存比较敏感,可以适当调整为1.5倍扩容,以平衡内存占用和扩容次数。同时,在大数据量下,每次扩容复制数据的开销较大,因此要尽量减少不必要的扩容操作。