если по простому и коротко, то для среза:
ёмкость(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.