Какой будет вывод программы

Выводятся [0], [0], [2], затем panic из-за индекса 1 при длине 1. Четвёртый Println не выполняется.

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

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

Выводятся [0], [0], [2], затем panic из-за индекса 1 при длине 1. Четвёртый Println не выполняется.

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

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

Условие

Определите, какой текст будет напечатан в каждой из точек вывода программы.

import (
  "fmt"
)

func main() {
  nums := make([]int, 1, 3)
  fmt.Println(nums) // <- what's the output?

  appendSlice(nums, 1)
  fmt.Println(nums) // <- what's the output?

  copySlice(nums, []int{2,3})
  fmt.Println(nums) // <- what's the output?

  mutateSlice(nums, 1, 4)
  fmt.Println(nums) // <- what's the output?
}

func appendSlice(sl []int, val int) {
  sl = append(sl, val)
}

func copySlice(sl, cp []int){
  copy(sl, cp)
}

func mutateSlice(sl []int, idx, val int) {
  sl[idx] = val
}

Ответ

Выводятся [0], [0], [2], затем panic из-за индекса 1 при длине 1. Четвёртый Println не выполняется.

appendSlice записывает 1 в свободную ячейку общего массива, но новая длина остаётся только в локальном параметре. Поэтому nums всё ещё имеет длину 1.

copy копирует не больше min(len(dst), len(src)), то есть один элемент 2. Наконец, mutateSlice обращается к nums[1], что запрещено независимо от capacity = 3. Для доступа к скрытому элементу сначала нужен явный допустимый reslice или сохранение расширенного среза, возвращаемого функцией.

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

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

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

Подробнее