@@ -690,11 +690,12 @@ func IntSlice(slice any) []int {
690
690
// DeleteAt delete the element of slice at index.
691
691
// Play: https://go.dev/play/p/800B1dPBYyd
692
692
func DeleteAt [T any ](slice []T , index int ) []T {
693
+ result := append ([]T (nil ), slice ... )
694
+
693
695
if index < 0 || index >= len (slice ) {
694
- return slice [:len (slice )- 1 ]
696
+ return result [:len (slice )- 1 ]
695
697
}
696
698
697
- result := append ([]T (nil ), slice ... )
698
699
copy (result [index :], result [index + 1 :])
699
700
700
701
// Set the last element to zero value, clean up the memory.
@@ -734,7 +735,8 @@ func Drop[T any](slice []T, n int) []T {
734
735
}
735
736
736
737
if n <= 0 {
737
- return slice
738
+ result := make ([]T , 0 , size )
739
+ return append (result , slice ... )
738
740
}
739
741
740
742
result := make ([]T , 0 , size - n )
@@ -752,7 +754,8 @@ func DropRight[T any](slice []T, n int) []T {
752
754
}
753
755
754
756
if n <= 0 {
755
- return slice
757
+ result := make ([]T , 0 , size )
758
+ return append (result , slice ... )
756
759
}
757
760
758
761
result := make ([]T , 0 , size - n )
@@ -798,7 +801,9 @@ func InsertAt[T any](slice []T, index int, value any) []T {
798
801
size := len (slice )
799
802
800
803
if index < 0 || index > size {
801
- return slice
804
+ result := make ([]T , size )
805
+ copy (result , slice )
806
+ return result
802
807
}
803
808
804
809
switch v := value .(type ) {
@@ -815,21 +820,21 @@ func InsertAt[T any](slice []T, index int, value any) []T {
815
820
copy (result [index + len (v ):], slice [index :])
816
821
return result
817
822
default :
818
- return slice
823
+ result := make ([]T , size )
824
+ copy (result , slice )
825
+ return result
819
826
}
820
827
}
821
828
822
829
// UpdateAt update the slice element at index.
823
830
// Play: https://go.dev/play/p/f3mh2KloWVm
824
831
func UpdateAt [T any ](slice []T , index int , value T ) []T {
825
- if index < 0 || index >= len (slice ) {
826
- return<
10000
/span> slice
827
- }
828
-
829
832
result := make ([]T , len (slice ))
830
833
copy (result , slice )
831
834
832
- result [index ] = value
835
+ if index >= 0 && index < len (slice ) {
836
+ result [index ] = value
837
+ }
833
838
834
839
return result
835
840
}
@@ -1019,7 +1024,9 @@ func SymmetricDifference[T comparable](slices ...[]T) []T {
1019
1024
return []T {}
1020
1025
}
1021
1026
if len (slices ) == 1 {
1022
- return Unique (slices [0 ])
1027
+ result := make ([]T , len (slices [0 ]))
1028
+ copy (result , slices [0 ])
1029
+ return Unique (result )
1023
1030
}
1024
1031
1025
1032
result := make ([]T , 0 )
@@ -1040,14 +1047,16 @@ func SymmetricDifference[T comparable](slices ...[]T) []T {
1040
1047
}
1041
1048
1042
1049
// Reverse return slice of element order is reversed to the given slice.
1050
+ // Reverse modifies the slice in place.
1043
1051
// Play: https://go.dev/play/p/8uI8f1lwNrQ
1044
1052
func Reverse [T any ](slice []T ) {
1045
1053
for i , j := 0 , len (slice )- 1 ; i < j ; i , j = i + 1 , j - 1 {
1046
1054
slice [i ], slice [j ] = slice [j ], slice [i ]
1047
1055
}
1048
1056
}
1049
1057
1050
- // ReverseCopy return a new slice of element order is reversed to the given slice.
1058
+ // ReverseCopy return a new slice of element where the order is reversed to the given
1059
+ // slice.
1051
1060
// Play: https://go.dev/play/p/c9arEaP7Cg-
1052
1061
func ReverseCopy [T any ](slice []T ) []T {
1053
1062
result := make ([]T , len (slice ))
@@ -1065,7 +1074,7 @@ func Shuffle[T any](slice []T) []T {
1065
1074
rand .Seed (time .Now ().UnixNano ())
1066
1075
1067
1076
rand .Shuffle (len (slice ), func (i , j int ) {
1068
- slice [ i ], slice [ j ] = slice [ j ], slice [ i ]
1077
+ swap ( slice , i , j )
1069
1078
})
1070
1079
1071
1080
return slice
@@ -1238,11 +1247,12 @@ func SortByField[T any](slice []T, field string, sortType ...string) error {
1238
1247
// Without creates a slice excluding all given items.
1239
1248
// Play: https://go.dev/play/p/bwhEXEypThg
1240
1249
func Without [T comparable ](slice []T , items ... T ) []T {
1250
+ result := make ([]T , 0 , len (slice ))
1251
+
1241
1252
if len (items ) == 0 || len (slice ) == 0 {
1242
- return slice
1253
+ return append ( result , slice ... )
1243
1254
}
1244
1255
1245
- result := make ([]T , 0 , len (slice ))
1246
1256
for _ , v := range slice {
1247
1257
if
3EBF
! Contain (items , v ) {
1248
1258
result = append (result , v )
0 commit comments