Что такое емкость среза?
если по простому и коротко, то для среза:ёмкость(cap) - это выделенная память под элементы, при превышении размер автоматически увеличивается в два раза.длина(len) - это инициализированная память элементов, для превышения(добавления) нужно вручную использовать append.
По умолчанию cap = len
Всегда будет cap >= len
Грубо говоря, cap выделяет память, а len инициализирует её всю или только часть .slice := make([]int, 2, 2) // эвивалентно slice := []int{0,0}
fmt.Printf("len: %d, cap: %d\n", len(slice), cap(slice))
fmt.Println(slice)

slice = append(slice, 3)

fmt.Printf("len: %d, cap: %d\n", len(slice), cap(slice))
fmt.Println(slice)
выведет:len: 2, cap: 2
[0 0]

len: 3, cap: 4
[0 0 3]
п.с.
если конкретно по вашему примеру то в первом и во втором случае у вас инициализировано только 10 элементов которые команда fmt.Println(slice) и выводит.
А паника при slice[11]=0 будет из за того что этот 11 элемент не инициализирован, хоть память под него и выделена, здесь необходимо использовать append.
Срез это структура данных описывающая множественное разделение массива и хранящееся отдельно от переменной. Срез это не массив. Срез описывает часть массива.
Если мы возьмем массив buffer из предыдущего раздела, то мы можем создать срез, который будет описывать элементы от 100 до 150 (если быть точным, то от 100 до 149 включительно) путем нарезания массива:
var slice []byte = buffer[100:150]
В этом куске кода, чтобы быть точными, мы использовали полное объявление переменной. Переменная slice имеет тип []byte, читается как «срез байтов» (slice of bytes) и создана из массива buffer, путем нарезания начиная с элемента 100 (включительно) до 150 (исключительно).
То есть вкратце если я правильно понял вопрос, нужно сначала создать массив, обычный, потом можно внутри него выделить срез, и только после этого можно работать со срезом.