From 70694311c6fa4b939b5d2f320da65edfda2a8b9b Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Wed, 13 Dec 2023 19:37:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20slice=20=E5=8C=85=E6=96=B0=E5=A2=9E=20P?= =?UTF-8?q?agedSlice=20=E7=BB=93=E6=9E=84=EF=BC=8C=E5=AE=83=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=88=86=E9=A1=B5=E7=AE=A1=E7=90=86=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=B9=B6=E5=87=8F=E5=B0=91=E9=A2=91=E7=B9=81=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AD=98=E5=88=86=E9=85=8D=E6=9D=A5=E6=8F=90=E9=AB=98=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/slice/paged_slice.go | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 utils/slice/paged_slice.go diff --git a/utils/slice/paged_slice.go b/utils/slice/paged_slice.go new file mode 100644 index 0000000..31da7e7 --- /dev/null +++ b/utils/slice/paged_slice.go @@ -0,0 +1,68 @@ +package slice + +// NewPagedSlice 创建一个新的 PagedSlice 实例。 +func NewPagedSlice[T any](pageSize int) *PagedSlice[T] { + return &PagedSlice[T]{ + pages: make([][]T, 0, pageSize), + pageSize: pageSize, + } +} + +// PagedSlice 是一个高效的动态数组,它通过分页管理内存并减少频繁的内存分配来提高性能。 +type PagedSlice[T any] struct { + pages [][]T + pageSize int + len int + lenLast int +} + +// Add 添加一个元素到 PagedSlice 中。 +func (slf *PagedSlice[T]) Add(value T) { + if slf.lenLast == len(slf.pages[len(slf.pages)-1]) { + slf.pages = append(slf.pages, make([]T, slf.pageSize)) + slf.lenLast = 0 + } + + slf.pages[len(slf.pages)-1][slf.lenLast] = value + slf.len++ + slf.lenLast++ +} + +// Get 获取 PagedSlice 中给定索引的元素。 +func (slf *PagedSlice[T]) Get(index int) *T { + if index < 0 || index >= slf.len { + return nil + } + + return &slf.pages[index/slf.pageSize][index%slf.pageSize] +} + +// Set 设置 PagedSlice 中给定索引的元素。 +func (slf *PagedSlice[T]) Set(index int, value T) { + if index < 0 || index >= slf.len { + return + } + + slf.pages[index/slf.pageSize][index%slf.pageSize] = value +} + +// Len 返回 PagedSlice 中元素的数量。 +func (slf *PagedSlice[T]) Len() int { + return slf.len +} + +// Clear 清空 PagedSlice。 +func (slf *PagedSlice[T]) Clear() { + slf.pages = make([][]T, 0) + slf.len = 0 + slf.lenLast = 0 +} + +// Range 迭代 PagedSlice 中的所有元素。 +func (slf *PagedSlice[T]) Range(f func(index int, value T) bool) { + for i := 0; i < slf.len; i++ { + if !f(i, slf.pages[i/slf.pageSize][i%slf.pageSize]) { + return + } + } +}