После вызова add будет выведено [a b x]. Переданный срез имеет свободную вместимость, поэтому append перезапишет третий элемент data.
Какой результат выведет программа в консоль (пример 9)
После вызова add будет выведено [a b x]. Переданный срез имеет свободную вместимость, поэтому append перезапишет третий элемент data.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, что будет напечатано после выполнения программы и объясните причину.
func add(slice []string) {
slice = append(slice, "x")
}
func main() {
data := []string{"a", "b", "c"}
add(data[1:2])
fmt.Println(data)
}
Ответ
После вызова add будет выведено [a b x]. Переданный срез имеет свободную вместимость, поэтому append перезапишет третий элемент data.
Срез data[1:2] содержит только b, но его вместимость равна 2: до конца общего массива остаются b и c. Внутренний append добавляет x сразу после b, на место c.
Изменяется только локальная длина среза, однако запись в общий массив видна через data. Чтобы append не затронул хвост, можно передать data[1:2:2]: его вместимость равна длине, и добавление потребует нового массива.