main.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package yu_array
  2. // Merge
  3. //
  4. // @Description: 合并数组
  5. // @param args 欲合并的数组
  6. // @return []T 合并结果
  7. func Merge[T any](args ...[]T) []T {
  8. j_size := 0
  9. for _, j_arr := range args {
  10. j_size += len(j_arr)
  11. }
  12. j_buf := make([]T, j_size)
  13. j_size = 0
  14. for _, j_arr := range args {
  15. copy(j_buf[j_size:], j_arr)
  16. j_size += len(j_arr)
  17. }
  18. return j_buf
  19. }
  20. // Insert
  21. func Insert[T any](t []T, i int, item ...T) []T {
  22. if i < 0 || len(item) == 0 {
  23. return t
  24. }
  25. if len(t) == 0 {
  26. return item
  27. }
  28. if i >= len(t) {
  29. return append(t, item...)
  30. }
  31. j_temp := make([]T, len(t)-i)
  32. copy(j_temp, t[i:])
  33. return append(append(t[:i], item...), j_temp...)
  34. }
  35. // Append
  36. func Append[T any](t []T, item ...T) []T {
  37. if len(item) == 0 {
  38. return t
  39. }
  40. return append(t, item...)
  41. }
  42. // Remove
  43. func Remove[T any](t []T, start int, size int) []T {
  44. if start < 0 || size < 1 || start+size > len(t) {
  45. return t
  46. }
  47. return append(t[:start], t[start+size:]...)
  48. }
  49. // Index
  50. func Index[T int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | int | uint | uintptr | string](t []T, sub T) int {
  51. for j_i, j_item := range t {
  52. if j_item == sub {
  53. return j_i
  54. }
  55. }
  56. return -1
  57. }
  58. // Xor
  59. //
  60. // @Description: 异或运算数据,修改原始 data
  61. // @param data 数据
  62. // @param key 数据
  63. // @return []byte 运算后的数据
  64. func Xor[T int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | int | uint | uintptr](data []T, key []T) []T {
  65. j_buf_len, j_key_len := len(data), len(key)
  66. if j_buf_len == 0 || j_key_len == 0 {
  67. return data
  68. }
  69. for j_i := 0; j_i < j_buf_len; j_i++ {
  70. data[j_i] ^= key[j_i%j_key_len]
  71. }
  72. return data
  73. }
  74. // XorEx
  75. //
  76. // @Description: 异或运算数据,不修改原始 data
  77. // @param data 数据
  78. // @param key 数据
  79. // @return []byte 运算后的数据
  80. func XorEx[T int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 | int | uint | uintptr](data []T, key []T) []T {
  81. j_buf_len, j_key_len := len(data), len(key)
  82. if j_buf_len == 0 || j_key_len == 0 {
  83. return nil
  84. }
  85. j_buf := make([]T, j_buf_len)
  86. for j_i := 0; j_i < j_buf_len; j_i++ {
  87. j_buf[j_i] = data[j_i] ^ key[j_i%j_key_len]
  88. }
  89. return j_buf
  90. }