Выводятся [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 или сохранение расширенного среза, возвращаемого функцией.