diff --git a/docs/api/packages/slice.md b/docs/api/packages/slice.md index fbfd6ac..38093ab 100644 --- a/docs/api/packages/slice.md +++ b/docs/api/packages/slice.md @@ -70,6 +70,7 @@ import ( - [FlatMap](#FlatMap) - [Merge](#Merge) - [Reverse](#Reverse) +- [ReverseCopy](#ReverseCopy) - [Reducedeprecated](#Reduce) - [ReduceConcurrent](#ReduceConcurrent) - [ReduceBy](#ReduceBy) @@ -1760,6 +1761,38 @@ func main() { } ``` +### ReverseCopy + +
反转切片中的元素顺序, 不改变原slice。
+ +函数签名: + +```go +func ReverseCopy[T any](slice []T) []T +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + strs := []string{"a", "b", "c", "d"} + + reversedStrs := slice.ReverseCopy(strs) + + fmt.Println(reversedStrs) + fmt.Println(strs) + + // Output: + // [d c b a] + // [a b c d] +} +``` + ### Reduce将切片中的元素依次运行iteratee函数,返回运行结果。
diff --git a/docs/en/api/packages/slice.md b/docs/en/api/packages/slice.md index 6e5e5b7..1578383 100644 --- a/docs/en/api/packages/slice.md +++ b/docs/en/api/packages/slice.md @@ -70,6 +70,7 @@ import ( - [FlatMap](#FlatMap) - [Merge](#Merge) - [Reverse](#Reverse) +- [ReverseCopy](#ReverseCopy) - [Reducedeprecated](#Reduce) - [ReduceConcurrent](#ReduceConcurrent) - [ReduceBy](#ReduceBy) @@ -1756,6 +1757,38 @@ func main() { } ``` +### ReverseCopy + +Return a new slice of element order is reversed to the given slice.
+ +Signature: + +```go +func ReverseCopy[T any](slice []T) []T +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + strs := []string{"a", "b", "c", "d"} + + reversedStrs := slice.ReverseCopy(strs) + + fmt.Println(reversedStrs) + fmt.Println(strs) + + // Output: + // [d c b a] + // [a b c d] +} +``` + ### ReduceReduce slice.
diff --git a/slice/slice.go b/slice/slice.go index de2f119..f8da44c 100644 --- a/slice/slice.go +++ b/slice/slice.go @@ -1002,7 +1002,19 @@ func Reverse[T any](slice []T) { } } -// Shuffle the slice. +// ReverseCopy return a new slice of element order is reversed to the given slice. +// Play: todo +func ReverseCopy[T any](slice []T) []T { + result := make([]T, len(slice)) + + for i, j := 0, len(slice)-1; i < len(slice); i, j = i+1, j-1 { + result[i] = slice[j] + } + + return result +} + +// Shuffle return a new slice with elements shuffled. // Play: https://go.dev/play/p/YHvhnWGU3Ge func Shuffle[T any](slice []T) []T { rand.Seed(time.Now().UnixNano()) diff --git a/slice/slice_example_test.go b/slice/slice_example_test.go index 3324a02..182845d 100644 --- a/slice/slice_example_test.go +++ b/slice/slice_example_test.go @@ -937,6 +937,19 @@ func ExampleReverse() { // [d c b a] } +func ExampleReverseCopy() { + strs := []string{"a", "b", "c", "d"} + + reversedStrs := ReverseCopy(strs) + + fmt.Println(reversedStrs) + fmt.Println(strs) + + // Output: + // [d c b a] + // [a b c d] +} + func ExampleIsAscending() { result1 := IsAscending([]int{1, 2, 3, 4, 5}) diff --git a/slice/slice_test.go b/slice/slice_test.go index 6e9a5c3..1c340e1 100644 --- a/slice/slice_test.go +++ b/slice/slice_test.go @@ -1114,6 +1114,17 @@ func TestReverse(t *testing.T) { assert.Equal([]string{"e", "d", "c", "b", "a"}, s2) } +func TestReverseCopy(t *testing.T) { + t.Parallel() + assert := internal.NewAssert(t, "TestReverseCopy") + + numbers := []int{1, 2, 3, 4, 5} + reversedNumbers := ReverseCopy(numbers) + + assert.Equal([]int{5, 4, 3, 2, 1}, reversedNumbers) + assert.Equal([]int{1, 2, 3, 4, 5}, numbers) +} + func TestDifference(t *testing.T) { t.Parallel()