Найти в Дзене

Массивы и слайсы в golang. Задачи и вопросы.

В предыдущей статье, я кратко рассказал о работе с массивами с слайсами в Go. Ниже будут задания и вопросы на понимание пройденной темы. Так же для самопроверки, будут представлены решения. Для лучшего понимания рекомендуется запускать примеры локально и выводить значения len и cap после каждой операции со слайсами. Почему так произошло? Слайс не копирует данные, а создаёт представление над частью существующего слайса. Поэтому при изменении элемента в новом слайсе, изменения происходят и в исходном. Индексы в новом слайсе начинаются с 0, но указывают на соответствующие элементы родительского слайса. Ожидаемый вывод: [5 5 5 5 5 5]
[1 2 3 4 5] Почему так произошло?
Потому что append при заполненной ёмкости создаёт новый слайс, и изменения идут уже в нём. Исходный sl остаётся прежним. Ожидаемый вывод: [5 5 5 5]
[5 5 5 5] Почему так произошло?
Потому что мы меняем элементы слайса напрямую, без создания нового слайса через append. Массив - это фиксированная структура данных, кот
Оглавление

В предыдущей статье, я кратко рассказал о работе с массивами с слайсами в Go.

Ниже будут задания и вопросы на понимание пройденной темы. Так же для самопроверки, будут представлены решения.

Задачи

1)

Почему изменился исходный слайс?
какой элемент был изменён и почему?
Почему изменился исходный слайс? какой элемент был изменён и почему?

2)

Изменился ли исходный слайс?
какую роль сыграл append?
Изменился ли исходный слайс? какую роль сыграл append?

3)

Изменился ли исходный слайс?
почему изменения видны за пределами функции?
Изменился ли исходный слайс? почему изменения видны за пределами функции?

Рекомендация

Для лучшего понимания рекомендуется запускать примеры локально и выводить значения len и cap после каждой операции со слайсами.

Вопросы

  • Чем отличаются массивы и слайсы в Go?
  • Почему размер массива нельзя изменить после создания?
  • Какие параметры есть у слайса и для чего они нужны?
  • Что происходит при добавлении элементов в слайс с помощью append?
  • В каком случае при append происходит копирование данных?
  • Почему изменения элементов слайса внутри функции видны снаружи?
  • В чём разница между длиной (len) и ёмкостью (cap) слайса?
  • Как влияет превышение capacity на работу слайса?
  • Почему массивы при передаче в функцию не изменяются?
  • В каких случаях стоит использовать массив, а в каких — слайс?

Объяснения к задачам

1)

-5

Почему так произошло?

Слайс не копирует данные, а создаёт представление над частью существующего слайса. Поэтому при изменении элемента в новом слайсе, изменения происходят и в исходном.

Индексы в новом слайсе начинаются с 0, но указывают на соответствующие элементы родительского слайса.

2)

-6

Ожидаемый вывод:

[5 5 5 5 5 5]
[1 2 3 4 5]

Почему так произошло?
Потому что append при заполненной ёмкости создаёт новый слайс, и изменения идут уже в нём. Исходный sl остаётся прежним.

3)

-7

Ожидаемый вывод:

[5 5 5 5]
[5 5 5 5]

Почему так произошло?
Потому что мы меняем элементы слайса напрямую, без создания нового слайса через append.

Ответы на вопросы

1. Чем отличаются массивы и слайсы в Go?

Массив - это фиксированная структура данных, которая копируется при передаче.

Слайс - это динамическая структура, которая ссылается на данные.

Массив при передаче в функцию полностью копируется, поэтому изменения происходят только в копии.

Слайс при передаче
не копирует данные, а ссылается на них, поэтому изменения видны снаружи.

2. Почему размер массива нельзя изменить после создания?

Потому что размер массива - часть его типа.

В Go тип [3]int и [4]int - это разные типы.
Поэтому размер массива нельзя изменить, можно только создать новый массив другого размера.

3. Какие параметры есть у слайса и для чего они нужны?

У слайса есть:

  • Длина (len) - показывает, сколько элементов сейчас в слайсе.
  • Ёмкость (cap) - показывает, сколько элементов можно добавить, прежде чем Go создаст новый слайс.

4. Что происходит при добавлении элементов в слайс с помощью append?

Append либо добавляет элемент в существующую память, либо создаёт новый слайс.

-8

Почему так произошло?

Go всегда старается использовать существующую память, но если места не хватает - создаёт новую и копирует данные.

5. В каком случае при append происходит копирование данных?

Когда длина слайса становится больше его ёмкости.

Cap - это физический предел текущего участка памяти.
При его превышении Go вынужден выделить новое место.

6. Почему изменения элементов слайса внутри функции видны снаружи?

Потому что функция работает с теми же данными, а не с копией.

-9

Слайс передаётся в функцию как структура, которая указывает на данные.
Поэтому изменение элемента влияет на исходный слайс.

7. В чём разница между len и cap?

len — сколько элементов видно сейчас.
cap — сколько элементов можно добавить без расширения памяти.

len управляет логикой работы со слайсом, cap — оптимизацией памяти.

8. Как влияет превышение capacity на работу слайса?

Превышение cap приводит к созданию нового слайса.

Go не может записать данные за пределы выделенной памяти,
поэтому создаёт новый участок и копирует данные.

9. Почему массивы при передаче в функцию не изменяются?

Потому что массив копируется целиком.

-10

Почему так произошло?

Функция получила копию массива, а оригинальный массив в main остался без изменений.

Предыдущий пост клик

Подробная статья на хабре

Моё сообщество в Вк

Мой Телеграм канал

-Артемий Кожакин