Будут напечатаны [1] и [1 5 3]. Слайс slice делит массив с base, а его capacity позволяет append записать 5 без выделения нового массива.
Влияние операции append и среза на содержимое массивов
Будут напечатаны [1] и [1 5 3]. Слайс slice делит массив с base, а его capacity позволяет append записать 5 без выделения нового массива.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой вывод получит программа при её запуске:
package main
import "fmt"
func foo(s []int) {
s = append(s, 5)
}
func main() {
base := []int{1, 2, 3}
slice := base[:1]
foo(slice)
fmt.Println(slice)
fmt.Println(base)
}
Ответ
Будут напечатаны [1] и [1 5 3]. Слайс slice делит массив с base, а его capacity позволяет append записать 5 без выделения нового массива.
В foo меняется только локальная длина слайса, поэтому slice в main по-прежнему содержит один видимый элемент. Но запись append попадает в base[1]. Чтобы избежать этого именно при append, ограничьте capacity: base[:1:1]. Для независимости от любых изменений элементов скопируйте данные в отдельный массив.