Если person содержит числовое поле age с нулевым значением, программа напечатает 1 и 2. После append слайс использует новый массив, а p1 остаётся указателем в старый.
Срез, ссылка и функция append
Если 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.