Срез, ссылка и функция append

Если person содержит числовое поле age с нулевым значением, программа напечатает 1 и 2. После append слайс использует новый массив, а p1 остаётся указателем в старый.

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

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

Если person содержит числовое поле age с нулевым значением, программа напечатает 1 и 2. После append слайс использует новый массив, а p1 остаётся указателем в старый.

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

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

Условие

Какой вывод будет у следующей программы?

func main() {
    people := make([]person, 2)

    p1 := &people[1]
    p1.age++

    people = append(people, person{})

    p1.age++

    fmt.Println(people[1].age)
    fmt.Println(p1.age)
}

Ответ

Если person содержит числовое поле age с нулевым значением, программа напечатает 1 и 2. После append слайс использует новый массив, а p1 остаётся указателем в старый.

make([]person, 2) создаёт len=2, cap=2. Первое увеличение меняет возраст на 1, затем append копирует два элемента в другой массив. Второе увеличение через p1 меняет лишь старый элемент. Старый массив остаётся живым, пока на него ссылается p1. В условии определение person опущено; вывод дан для указанного обычного числового age.

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

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

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

Подробнее