Advertisement
AlexNovoross87

array&slice

May 9th, 2025 (edited)
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.58 KB | None | 0 0
  1. МАССИВЫ
  2. ===============================================
  3. Массивы представляют собой способ хранения нескольких элементов одного типа данных
  4. | Данные хранятся последовательно в "массиве" данных.
  5. | Каждый отдельный фрагмент данных называется элементом
  6. Для доступа к элементам в массиве используется индекс массива
  7. | Индекс начинается с 0, что означает, что первый элемент массива имеет индекс О
  8. Массивы имеют фиксированный размер и их нельзя изменить
  9.  
  10. var myArray [3]int //неинициализированный массив
  11. myArray := [3]int{7, 8, 9} //массив на 3 элемента все инициализированы
  12. myArray := [...]int{7, 8, 9} // ... при инициализации сам вычислит длину
  13. myArray := [4]int{7, 8, 9} // первые 3 инициализированны , 4 - значенние по умолчанию.
  14. Элементы, которым не присвоены значения при создании массива, будут
  15.  
  16. Доступ к элементам массива
  17. var myArray [3]int
  18. myArray [0] = 7
  19. myArray [1] = 8
  20. myArray [2] = 9
  21. //присвоение переменной
  22. iteml := myArray[0]
  23.  
  24. -------------------------------------------------------------------------
  25.  
  26. Цикл
  27. Хорошей практикой является присваивание элемента переменной во время итерации
  28. |Это упрощает чтение в больших функциях или вложенных циклах
  29. myArray := [...] int{7, 8, 9}
  30. for i := 0; 1 < len(myArray); i++ {
  31. item := myArray[i]
  32. fmt.Prinfln(item)
  33. }
  34.  
  35.  
  36. СРЕЗЫ
  37. ===========================================================================
  38. Срезы (slices) - это специальный тип данных, который работает с массивами
  39. в языке программирования Go. Они позволяют "просматривать" (получать вид)
  40. массива
  41. | Представления (views) динамичны и не имеют фиксированного размера.
  42. Функции в Go могут принимать срезы в качестве параметров функции.
  43. С помощью срезов можно работать с массивами любого размера
  44.  
  45. Создание среза
  46. --------------
  47. В Go можно одновременно создавать срезы (slices) и базовые массивы
  48. mySlice := []int{l, 2, 3}
  49. [в срезе ничего не указываем внутри квадратных скобок]
  50. Доступ к элементам в срезе (slice) осуществляется так же, как и в массиве
  51. item1 := mySlice[0]
  52.  
  53. Синтаксис срезов
  54. -----------------
  55. В синтаксисе срезов (slice) можно создавать срезы из конкретных элементов
  56. массива или другого среза.
  57. Индекс начала (a) Индекс конца (b)
  58. slice[а:Ь]
  59. Пропуск символа "а" означает "начинать с О".
  60. Пропуск символа "b" означает "до конца".
  61.  
  62. Пример синтаксиса среза
  63. -----------------------
  64. numbers := [...]int{l, 2, 3, 4}
  65. slicel := numbers[:] // [1, 2, 3, 4]
  66. slice2 := numbers[l:] // [2, 3, 4]
  67. //Тут берем срез от среза
  68. slice3 := slice2[:l] // [2]
  69. slice# := numbers [:2] // [1, 2]
  70. slices := numbers [1:3] // [2, 3]
  71. Ошибка - попытка создатъ срез за пределами длины массива
  72.  
  73. Динамические массивы
  74. --------------------
  75. С помощью срезов можно создавать массивы, которые могут быть расширены
  76. I Функция appendO может добавлять дополнительные элементы.
  77. numbers := []int{l, 2, 3}
  78. numbers = append(numbers, 4, 5, 6) // [1, 2, 3, 4, 5, 6]
  79. Три точки могут быть использованы для расширения среза с помощью другого среза
  80. parti := []int{l, 2, 3}
  81. part2 := []int{4, 5, 6}
  82. combined := append(part1, part2...)
  83.  
  84. Предварительное выделение памяти:
  85. ---------------------------------
  86. Срезы могут быть предварительно выделены с указанием определенной ёмкости.
  87. Функция make() используется для предварительного выделения памяти для среза
  88. Это полезно, когда известно количество элементов, но их значения пока неизвестны
  89.  
  90.  
  91.                1    2   3
  92. slice := make([]int,5, 10)
  93.  
  94. 1) Тип слайса
  95. 2) Длина слайса
  96. 3) Емеость слайса
  97.  
  98.  
  99. Передача срезов в функции
  100. -------------------------
  101. Параметры функций, которым требуется срез, могут работать с срезами любого размера
  102. func iterate(slice []int)
  103. {
  104.     for i := 0; i < len(slice); i++ { //}
  105. }
  106. small := []int{1}
  107. big := []int{1, 2, 3, 4, 5, 6, 7}
  108. iterate(small) iterate(big)
  109.  
  110.  
  111. Многомерные срезы
  112. ------------------
  113. board := [][] string{
  114. // type declaration is optional
  115.  []string{"_", "_", "_"},
  116.          {"_", "_", "_"},
  117.          {"_", "_", "_"},
  118. }
  119.  
  120.  board[0][0] = "X"
  121.  board[2][2] = "0"
  122.  board[l][2] = "X"
  123.  board[1][0] = "0"
  124.  board[0][2] = "X"
  125.  
  126.  Подводные камни
  127.  ----------------------
  128. func some() {
  129.    var list []{} //будет Nil
  130.    list = []int{}//в этом случае list не будет nil
  131.    *Проверку слайса на пустоту нужно проверять len(list)
  132.    *Если мы хотим изменнть слайс, но не хотим затрагивать исходный массив -
  133.     создаем копию.
  134.    
  135.    Случай1:
  136.    
  137.    list := make([]int, 4,4)
  138.    //list2 создаст нвый массив
  139.    list2 := append(list, 1)
  140.    list[0] = 5
  141.    list[2] = 9
  142.    
  143.   list1 [5,0,0,0]
  144.   list2 [9,0,0,1]
  145.  
  146.  
  147.   Случай2:
  148.    
  149.    list := make([]int, 4,5!!!!!!!!<-- емкость 5)
  150.    //list2 НЕ создаст новый массив так как емкость соответствует..
  151.    list2 := append(list, 1)
  152.    list[0] = 5
  153.    list[2] = 9
  154.    
  155.   list1 [9,0,0,0]
  156.   list2 [9,0,0,0,1]
  157.    
  158.    
  159.    *Результат функции append нужно присваивать одной и той же переменной
  160.  
  161. }
  162.  
  163. var digitRegxp = regexp.MustCompile("[0-9]+")
  164.  
  165. ***** func FindDigits(filename string) []byte {
  166.     //Здесь потенциально может быть большой размер слайса
  167.     b, _ := os.ReadFile(filename)
  168.     //Здесь функция выполнит свою работу, но исходный слайс
  169.     // может остаться огромным
  170.     b = digitRegxp.Find(b)
  171.  
  172.     //Создадим новый слайс рабочей длины
  173.     res := make([]byte, len(b))
  174.     //Скопируем результат из b в новый слайс
  175.     copy(res, b)
  176.     return res
  177. }
  178.  
  179.  
  180.  
  181.  
  182.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement