Что будет со слайсом, если взять его срез и сделать append

«Что будет со слайсом, если взять его срез и сделать append» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При взятии среза слайса и выполнении append возможны 2 сценария:

  1. Если capacity исходного слайса позволяет (новые элементы помещаются в существующий буфер), то:

    • Изменения через новый срез повлияют на исходный слайс
    • append добавит элементы в общий буфер
  2. Если capacity недостаточно, то:

    • Будет создан новый буфер
    • Исходный слайс не изменится
    • Новый срез будет ссылаться на новый буфер

Пример:

a := []int{1, 2, 3, 4}
b := a[:2]       // [1, 2]
b = append(b, 5) // изменяет a[2], т.к. capacity хватает
// a = [1, 2, 5, 4], b = [1, 2, 5]

c := a[:2:2]     // force capacity=2
c = append(c, 6)  // создает новый буфер
// a = [1, 2, 5, 4], c = [1, 2, 6]