Как работают параметры длины и ёмкости в функции make

Вывод: [0 0 0 0 0 0 0 0 0 0] []. У a длина 10, у b длина 0, хотя вместимость обоих срезов равна 10.

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

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

Вывод: [0 0 0 0 0 0 0 0 0 0] []. У a длина 10, у b длина 0, хотя вместимость обоих срезов равна 10.

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

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

Условие

Определите, какой вывод получит программа, когда два среза создаются разными способами: один — только с длиной, второй — с нулевой длиной, но указана ёмкость. Что напечатает вызов fmt.Println?

package main

import "fmt"

func main() {
    a := make([]int, 10)
    b := make([]int, 0, 10)
    fmt.Println(a, b) // ????????
}

Ответ

Вывод: [0 0 0 0 0 0 0 0 0 0] []. У a длина 10, у b длина 0, хотя вместимость обоих срезов равна 10.

make([]int, 10) создаёт десять доступных элементов с нулевым значением int. Вариант make([]int, 0, 10) лишь резервирует место для будущих append.

Индекс b[0] при длине 0 недопустим и вызывает panic, несмотря на свободную вместимость. Добавление через b = append(b, 1) увеличит длину и использует зарезервированный массив. fmt.Println показывает только элементы в пределах len, а не весь capacity.

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

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

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

Подробнее