@lavagod

Как формируется capacity в Golang?

Здравствуйте.

Разбираюсь в Golang потихоньку, дошел до слайсов. В частности, до того как их "мержить" (складывать). Проверяю пример про мерженье двух слайсов, все работает, суть я понимаю. Но вопрос такой: почему при создании слайса капасити не равна длине? Почему она больше и как Golang это подбирает? У меня два слайса, оба по длине = 5, а капасити им выставляется = 8. Я ставил длину = 3 (1,2,3), капасити было = 4. Я ставил длину = 10, капасити = 12.

У меня была идея, что капасити выставляется от степени 2, но понимаю что нет. Как она подбирется?

package main

import "fmt"

func main() {

	var buf []int 						// buf = первый слайс
	var new []int 						// new = второй слайс
	buf = append(buf, 1,2,3,4,5) 		// buf = 1,2,3,4,5 (len=5, cap=8)
	new = append(new, 10,20,30,40,50) 	// new = 10,20,30,40,50 (len-5, cap=8)
	fmt.Println("Длина:",len(buf), "Капасити:", cap(buf), "Buf:", buf)
	fmt.Println("Длина:",len(new), "Капасити:", cap(new), "Buf:", new)
	// buf = buf + new
	buf = append(buf, new...)			// buf = buf + new
	fmt.Println("Длина:",len(buf), "Капасити:", cap(buf), "Buf:", buf)
	// buf = [1 2 3 4 5 10 20 30 40 50] (len=10, cap=16)
}


Спасибо.
  • Вопрос задан
  • 749 просмотров
Пригласить эксперта
Ответы на вопрос 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
https://golang.org/src/runtime/slice.go
func growslice(et *_type, old slice, cap int) slice {
...
    for 0 < newcap && newcap < cap {
	newcap += newcap / 4   //Вот здесь
    }
...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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