From bd0231bf42e62e3497f403222cb9271c52e76f81 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sun, 16 Jun 2024 02:55:28 +0000 Subject: [PATCH] slices.Resize --- slice/Slice.go | 8 ++++++++ slice/Slice_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/slice/Slice.go b/slice/Slice.go index 5d7cceb..78c4589 100644 --- a/slice/Slice.go +++ b/slice/Slice.go @@ -221,3 +221,11 @@ func DelBack[S ~[]T, T any](s *S, fromIndex int) { func AddBack[S ~[]*T, T any](s *S, t *T) { *s = append(*s, t) } + +func Resize[S ~[]T, T any](s *S, size int) { + if len(*s) >= size || cap(*s) >= size { + *s = (*s)[:size] + } else { + *s = append((*s)[:cap(*s)], make([]T, size-cap(*s))...) + } +} diff --git a/slice/Slice_test.go b/slice/Slice_test.go index fc86d8d..bb33187 100644 --- a/slice/Slice_test.go +++ b/slice/Slice_test.go @@ -6,6 +6,38 @@ import ( "unsafe" ) +func TestResize(t *testing.T) { + var s = make([]byte, 10) + t.Log(unsafe.Pointer(&s), len(s), cap(s)) + s = s[:0] + t.Log(unsafe.Pointer(&s), len(s), cap(s)) + Resize(&s, 8) + if len(s) != 8 { + t.FailNow() + } + t.Log(unsafe.Pointer(&s), len(s), cap(s)) + Resize(&s, 4) + if len(s) != 4 { + t.FailNow() + } + t.Log(unsafe.Pointer(&s), len(s), cap(s)) + Resize(&s, 11) + if len(s) != 11 { + t.FailNow() + } + t.Log(unsafe.Pointer(&s), len(s), cap(s)) + Resize(&s, 25) + if len(s) != 25 { + t.FailNow() + } + t.Log(unsafe.Pointer(&s), len(s), cap(s)) + Resize(&s, 3) + if len(s) != 3 { + t.FailNow() + } + t.Log(unsafe.Pointer(&s), len(s), cap(s)) +} + func TestXxx(t *testing.T) { var ( b = New[byte](5) -- 2.39.2