Вывод: [0 0 0 0 0 0 0 0 0 0] []. У a длина 10, у b длина 0, хотя вместимость обоих срезов равна 10.
Как работают параметры длины и ёмкости в функции make
Вывод: [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.