Исследование вывода при работе с append и общими ёмкостями срезов

Вывод будет [1 2 3 4 5] [1 2 3 4 5 7] [1 2 3 4 5 7]. Все три слайса используют общий массив с ёмкостью 10.

Короткий ответ

Что ответить на собеседовании

Вывод будет [1 2 3 4 5] [1 2 3 4 5 7] [1 2 3 4 5 7]. Все три слайса используют общий массив с ёмкостью 10.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо предсказать, какие значения напечатаются программой, использующей срезы и функцию append, а также дать объяснение полученного вывода, учитывая совместное использование единой ёмкости и особенности поведения срезов в Go.

package main

import (
  "fmt"
)

func main() {
  s1 := make([]int, 0, 10)
  s1 = append(s1, []int{1, 2, 3, 4, 5}...)
  s2 := append(s1, 6)
  s3 := append(s1, 7)

  fmt.Println(s1, s2, s3)
}

Ответ

Вывод будет [1 2 3 4 5] [1 2 3 4 5 7] [1 2 3 4 5 7]. Все три слайса используют общий массив с ёмкостью 10.

Оба append начинаются с длины s1, равной 5, поэтому записывают в одну и ту же шестую позицию: сначала 6, затем 7. s1 по-прежнему имеет длину 5 и не показывает эту позицию. Здесь ёмкость задана явно, так что результат не зависит от стратегии автоматического роста слайсов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее