Программа напечатает [4 5]. Укороченный срез a сохраняет вместимость 5, поэтому можно снова открыть элементы за его текущей длиной.
Какой результат выведет программа? (пример 74)
Программа напечатает [4 5]. Укороченный срез a сохраняет вместимость 5, поэтому можно снова открыть элементы за его текущей длиной.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что будет напечатано после выполнения следующей Go‑программы?
package main
import (
"fmt"
)
func main(){
a := []int{1,2,3,4,5}
a = a[:3]
b := a[3:]
fmt.Println(b[:2])
}
Ответ
Программа напечатает [4 5]. Укороченный срез a сохраняет вместимость 5, поэтому можно снова открыть элементы за его текущей длиной.
После a = a[:3] длина a равна 3, вместимость — 5. Выражение a[3:] корректно: получается срез длины 0 и вместимости 2, начинающийся с четвёртого элемента исходного массива.
Затем b[:2] расширяет его до доступной вместимости и показывает 4 и 5. Это отличается от индексирования a[3], которое при длине 3 вызвало бы panic. Для запрета такого расширения при передаче данных можно ограничить capacity полным slice-выражением.