@historydev
Острая аллергия на анимешников

Как понять от первого элемента в слайсе(capacity)?

Дан такой код, который по итогу выдаёт len = 5, cap 6.
Если удалить строку где добавляется цифра 1 - len = 4, cap = 4
Если удалить строку где добавляется цифра 0 - len = 4, cap = 4
Последняя строка добавляет 3 цифры 2,3 и 4 - len = 5, cap = 6 (если всё как есть оставить)
Почему так? Если логика сложения предыдущих элементов, то должно быть как-то так? - [] + [0] + [1] +[2 3 4] и это даёт 6?
package main

import "fmt"

func main() {
	var s []int
	printSlice(s)

	// append works on nil slices.
	//s = append(s, 0)
	printSlice(s)

	// The slice grows as needed.
	s = append(s, 1)
	printSlice(s)

	// We can add more than one element at a time.
	s = append(s, 2, 3, 4)
	printSlice(s)
}

func printSlice(s []int) {
	fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
Каждый раз, когда у слайса кончается капасити, го делает переаллокацию данных в памяти, увеличивая капасити и копируя старые данные в новую аллоцированную область. Причем, капасити растет с запасом, чтобы свести количество переаллокаций к минимуму (ибо это дорогая операция). Поэтому это нормальная ситуация, когда капасити становится больше, чем длина. Го вам делает запас на будущее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы