Вывод будет [1 2 3 4 5] [1 2 3 4 5 7] [1 2 3 4 5 7]. Все три слайса используют общий массив с ёмкостью 10.
Исследование вывода при работе с append и общими ёмкостями срезов
Вывод будет [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 и не показывает эту позицию. Здесь ёмкость задана явно, так что результат не зависит от стратегии автоматического роста слайсов.