Будет напечатано [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 должна вернуть новый слайс, а вызывающий код — присвоить его.