Используя запись полного среза b = a[low:high:max]
, можно получить срез с меньшей емкостью, чем назначенный срез a
. Емкость среза b
будет max - low
, а хранилище элементов будет совместно использоваться с a
(копия не создается). max - low
должно быть меньше или равно cap(a)
, в противном случае мы получаем пани c:
a := make([]byte, 8)
b := a[:3:10]
panic: runtime error: slice bounds out of range [::10] with capacity 8
Какая польза от возможности получить ломтик с меньшей емкостью?
Единственное полезное приложение, которое я нашел, - это принудительное создание копии среза с append
, который обходит емкость среза с уменьшенной емкостью.
a := []int{1, 2, 3, 4, 5}
b := a[1:3:3]
fmt.Println("a:", a, "b:",b, "cap(b):", cap(b)) // -> a: [1 2 3 4 5] b: [2 3] cap(b): 2
b[0] = 6
fmt.Println("a:", a, "b:",b, "cap(b):", cap(b)) // -> a: [1 6 3 4 5] b: [6 3] cap(b): 2
b = append(b, 7) // copy slice elements and extends capacity of b
fmt.Println("a:", a, "b:",b, "cap(b):", cap(b)) // -> a: [1 6 3 4 5] b: [6 3 7] cap(b): 4
b[1] = 8
fmt.Println("a:", a, "b:",b, "cap(b):", cap(b)) // -> a: [1 6 3 4 5] b: [6 8 7] cap(b): 4
Обратите внимание, что такая копия не очевидна и требует комментария, чтобы сделать ее видимой для читателя.
Другое полезное приложение?