Влияние операции append и среза на содержимое массивов

Будут напечатаны [1] и [1 5 3]. Слайс slice делит массив с base, а его capacity позволяет append записать 5 без выделения нового массива.

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

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

Будут напечатаны [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]. Для независимости от любых изменений элементов скопируйте данные в отдельный массив.

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

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

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

Подробнее