// Что выведет программа в местах, где стоят комментарии?

Будет напечатано [0], затем [0 1024], затем [0], после чего случится panic: индекс 1 вне длины исходного слайса, равной 1.

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

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

Будет напечатано [0], затем [0 1024], затем [0], после чего случится panic: индекс 1 вне длины исходного слайса, равной 1.

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

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

Условие

// Что выведет программа в местах, где стоят комментарии? package main

import "fmt"

func main() { nums := make([]int, 1, 2) fmt.Println(nums) //

appendSlice(nums, 1024)
fmt.Println(nums)  //

mutateSlice(nums, 1, 512)
fmt.Println(nums)  //

}

func appendSlice(sl []int, val int) { sl = append(sl, val) fmt.Println(sl) // }

func mutateSlice(sl []int, idx, val int) { sl[idx] = val fmt.Println(sl) // }

Ответ

Будет напечатано [0], затем [0 1024], затем [0], после чего случится panic: индекс 1 вне длины исходного слайса, равной 1.

До паники вывод такой:

[0]
[0 1024]
[0]

appendSlice получает копию дескриптора. Ёмкости хватает, поэтому 1024 записывается в общий базовый массив, но длина nums у вызывающей функции остаётся 1. mutateSlice пытается обратиться к nums[1], а проверка границ использует len, не cap. Оба последующих Println недостижимы. Чтобы расширение стало видимым, appendSlice должна вернуть новый слайс, а вызывающий код — присвоить его.

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

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

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

Подробнее