IT заметки по программированию
IT заметки по программированию
IT заметки по программированию
IT заметки по программированию

Golang tricks: работа слайсов

Что будет выводить функция fmt.Println(slice) в каждом случае и почему:

Разберем, что происходит на каждом этапе этого кода.

Что делает make([]int, 3, 4)

Эта строка создает слайс slice с:

  • длиной 3 (len(slice) = 3),
  • вместимостью 4 (cap(slice) = 4),
  • инициализированный значениями [0, 0, 0] (по умолчанию для int).

Детали функции prikol

Функция prikol:

  • принимает слайс в качестве аргумента,
  • делает append с добавлением числа 1 в конец слайса.

Здесь важно понимать, что append работает по-разному в зависимости от вместимости слайса:

  • Если текущая вместимость слайса позволяет вместить новый элемент, append добавит элемент в конец текущего массива, на который указывает слайс, и вернет тот же массив.
  • Если вместимость исчерпана, append создаст новый массив с удвоенной вместимостью, скопирует данные из старого массива в новый и вернет новый массив.

Но! Поскольку append возвращает новый слайс, то для того чтобы результат сохранился, его нужно присвоить обратно. В функции prikol этого не делается, что играет решающую роль.

Анализ по строкам

  1. Первая строка prikol(slice)В этой строке функция prikol получает копию слайса slice:
    • append добавляет 1, и полученный слайс [0, 0, 0, 1] создается с вместимостью 4.
    • Но slice = append(slice, 1) присваивается только внутри prikol, без влияния на исходный slice в main.

    В итоге внешний slice не меняется и остается [0, 0, 0].

     

  2. Вторая строка prikol(slice)Повторный вызов prikol(slice) снова работает по аналогии с первым:
    • Внутри prikol снова создается новый слайс [0, 0, 0, 1], но изменения не передаются обратно в main.

    Поэтому снова внешний slice остается неизменным и равен [0, 0, 0].

     

  3. Третья строка prikol(slice[:1])Здесь начинается самое интересное:
    • В prikol передается слайс slice[:1], который имеет длину 1 и емкость 4 (так как он «видит» оставшуюся часть массива).
    • Теперь append(slice, 1) добавляет 1 в позицию [1], и, поскольку это тот же базовый массив, изменение отражается на slice в main.

    В результате после третьего вызова slice в main становится [0, 1, 0].

     

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *